0

我对 Java 比较陌生,并且在为我正在处理的程序提出真正面向对象的设计时遇到了麻烦。这是该计划的背景。该程序是一个基于 gui 的计算机电话应用程序,它监控电话并充当 callerID(除其他外)。我目前的设计如下。我创建了以下类。

MainWindow——这是gui的主窗口

电话——模拟实际设备

PopUpWindow——这个模型是在Phone类中的一个事件上弹出的弹出窗口

PhoneMessenger - 当电话类中发生事件时,它会向另一台设备发送消息

我遇到的问题是,当 Phone 类中发生事件时,我希望它更新 MainWindow 类中的值。我通过在 MainWindow 类中构造一个静态类变量 MainWindow window 并使用静态方法根据 Phone 类中的事件更改 MainWindow 类的值来使程序工作。它工作正常,但我认为这不符合面向对象的设计原则,因为 Phone 类现在可以访问 MainWindow 类的所有内部值。如果有人可以帮助我设计这将是惊人的。

4

4 回答 4

1

听起来您想使用自定义EventListener对象。

Phone课堂上,假设您希望在主窗口中显示一个响铃事件。创建一个这样的界面:

public interface RingListener {    
    public void ringing();
}

在 Phone 类中,创建一个方法调用addRingListener(RingListener listener)并存储添加到 a 中的侦听器List,例如ArrayList.

MainWindow类中,存储Phone对象的一个​​实例并向其中添加一个RingListener,实现抽象的响铃方法。然后输入您的代码以了解会发生什么。

phone.addRingListener(new RingListener() {

    @Override
    public void ringing() {
        //Do stuff
    }
}

Phone类中,每当事件发生时,遍历RingListenersList 中的所有内容并调用 ringing 方法。

//Ringing happens!
for (RingListener listener : ringListeners) {
    listener.ringing();
}

这只是对EventListener意识形态如何运作的快速概述。我建议看看ActionListener它是如何工作的,并搜索一些关于如何创建自己的自定义侦听器的教程。

于 2013-09-02T05:59:04.223 回答
1
  1. 这可能是因为您将所有类都放在一个包中,并且您没有使用访问修饰符,因此创建了所有成员package-protected(也许package-public是一个更好的名称)。private更合乎逻辑地对成员变量和/或不同包中的单独类使用访问修饰符。

  2. 如果我正确理解您的设计,您不应该使用它class PhoneMessenger来传递事件吗?在这种情况下,不要考虑“更新主窗口中的值”。想想“电话中发生了一个事件 X,我将通知相关方 ( MainWindow)”。当MainWindow接收到这个事件时,它有责任决定做什么(在这种情况下改变变量的值),而不是class Phone.

于 2013-09-02T05:59:44.530 回答
0

看看我的问题。我面临着一个类似的问题。但是 SO 的用户非常聪明。看看这个 -->在 TextArea 上打印交易状态

于 2013-09-02T06:05:43.983 回答
0

首先,您需要了解OPEN CLOSE PRINCIPLE。这是针对oo设计方法的。并尝试使用接口来限制任何具有已定义方法的类的范围。要访问任何对象的值,请始终使用POJO类。以下是您需要如何有效设计的链接。
1.开闭原则
2.接口隔离原则
3.其他设计原则

于 2013-09-02T05:58:41.493 回答