【问题标题】:Object Oriented Program Design Questions面向对象的程序设计问题
【发布时间】:2013-09-05 03:50:33
【问题描述】:

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

MainWindow-这是gui的主窗口

电话——这模拟了实际的设备

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

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

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

【问题讨论】:

  • 你在使用 Swing 吗?如果是,我有答案
  • 模型视图控制器,我的朋友。

标签: java oop


【解决方案1】:

首先,您需要了解开闭原则。这是针对oo设计方法的。并尝试使用接口来限制任何具有已定义方法的类的范围。要访问任何对象的值,请始终使用POJO 类。以下是您如何高效设计所需的链接。
1.Open Close Principle
2. Interface Segregation Principle
3.other design principles

【讨论】:

    【解决方案2】:

    听起来您想使用自定义 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 类中,每当事件发生时,遍历 List 中的所有 RingListeners 并调用响铃方法。

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

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

    【讨论】:

    • 我认为RingListener 应该是一个接口。
    【解决方案3】:
    1. 这可能是因为您将所有类都放在一个包中,并且您没有使用访问修饰符,因此使所有成员成为package-protected(也许package-public 是一个更好的名称)。更合理地对成员变量和/或不同包中的单独类使用访问修饰符private

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

    【讨论】:

      【解决方案4】:

      看看我的问题。我遇到了一个类似的问题。但是 SO 的用户非常聪明。看看这个 --> Print transaction status on TextArea

      【讨论】:

        猜你喜欢
        • 2011-04-19
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多