我对Java相对较新,并且无法为我正在开发的程序提供真正面向对象的设计。这是该计划的背景。该程序是基于gui的计算机电话应用程序,它监视电话并充当呼叫者ID(以及其他内容)。我目前的设计如下。我创建了以下类。
MainWindow-这是gui的主窗口
手机 - 这是实际设备的模型
PopUpWindow - 它模拟在Phone类中的事件上弹出的弹出窗口
PhoneMessenger - 当电话类中发生事件时,它会向另一台设备发送消息
我遇到麻烦的部分是,当Phone类中发生事件时,我希望它更新MainWindow类中的值。我让程序通过在MainWindow类中构造一个静态类变量MainWindow窗口并使用静态方法在Phone类中的事件上更改MainWindow类的值来工作。它工作正常,但我不认为这遵循面向对象的设计原则,因为Phone类现在可以访问MainWindow类的所有内部值。如果有人可以帮我解决这个令人惊奇的设计问题。
答案 0 :(得分:1)
听起来您想要使用自定义EventListener
对象。
从Phone
类开始,假设您希望在主窗口中显示振铃事件。创建一个这样的界面:
public interface RingListener {
public void ringing();
}
在Phone类中,创建方法调用addRingListener(RingListener listener)
并存储List
中添加的侦听器,例如ArrayList
。
在MainWindow
类中,存储Phone
对象的实例并向其添加RingListener
,实现抽象振铃方法。然后输入代码以了解会发生什么。
phone.addRingListener(new RingListener() {
@Override
public void ringing() {
//Do stuff
}
}
在Phone
课程中,每当事件发生时,遍历列表中的所有RingListeners
并调用振铃方法。
//Ringing happens!
for (RingListener listener : ringListeners) {
listener.ringing();
}
这只是对EventListener
意识形态如何运作的简要概述。我建议您查看ActionListener
并了解它是如何工作的,以及搜索有关如何创建自定义侦听器的一些教程。
答案 1 :(得分:1)
这可能是因为你在一个包中拥有所有类,并且你没有使用访问修饰符,因此使所有成员package-protected
(也许package-public
是一个更好的名字)。对逻辑上的成员变量和/或不同包中的单独类使用访问修饰符private
。
如果我正确理解您的设计,您是否应该使用class PhoneMessenger
来发送活动?在这种情况下,不要考虑“更新MainWindow中的值”。用“手机中发生的事件X,我将通知感兴趣的各方(MainWindow
)”来思考。当MainWindow
收到此事件时,它有责任决定做什么(在这种情况下更改变量的值),而不是class Phone
。
答案 2 :(得分:0)
首先,您需要了解 OPEN CLOSE PRINCIPLE 。这是为oo设计方法。并尝试使用接口来限制具有已定义方法的任何类的范围。要访问任何对象的值,请始终选择POJO类。以下是您需要如何有效设计的链接。
1.Open Close Principle
2. Interface Segregation Principle
3.other design principles
答案 3 :(得分:0)
看看我的问题。我遇到了一个类似的问题。然而,SO的用户非常聪明。看看这个 - > Print transaction status on TextArea