2

我目前正在尝试开发一个简单的 GUI 记事本来提高我在 OOP 方面的技能。我在开发时坚持单一职责原则。我按照原则将应用程序分成了几个部分。

// This class runs the whole application
public class Notepad {

   public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
                public void run() {
                new NotepadFrame();
           }
            });

    }
}
// This class is responsible for setting up a frame
public class NotepadFrame extends JFrame {

public NotepadFrame() {
        super("Notepad");

        MenuBar menuBar = new MenuBar();
        setJMenuBar(menuBar.createMenuBar());

        pack();
        setVisible(true);

    }
}
// This class sets up a menu bar
public class MenuBar {

public JMenuBar createMenuBar() {

        JMenuBar menuBar = new JMenuBar();
        Buttons buttons = new Buttons();

        menuBar.add(buttons.createFileMenuItems());
        menuBar.add(buttons.createEditMenuItems());
        menuBar.add(buttons.createFormatMenuItems());
        menuBar.add(buttons.createHelpMenuItems());

        return menuBar;
    }
}

还有其他类。Buttons - 此类用于创建菜单栏的按钮。MenuItemActionListeners - 此类处理按钮触发的所有事件。

我是否根据简单责任原则以正确的方式划分应用程序?

我还想找出处理动作侦听器、鼠标侦听器等的最佳方法。

到目前为止,我使用了一种 actionPerformed(SomeEvent e) 方法来处理所有事件。

private JButton button;
private JButton button2;

public void actionPerformed(ActionEvent e) {

    Object source = e.getSource();

    if (source == button) {

    } else if (source == button2) {

    } // etc.

}

我意识到这是处理事件监听器的坏方法。随着应用程序大小的增长,添加如此多的条件语句会使代码的可读性降低,CPU 性能也会下降。

您如何处理应用程序中的事件侦听器?在开发像 MS Office 或 AutoCAD 这样庞大而严肃的应用程序时,您将如何编写事件侦听器?

4

3 回答 3

1

我很高兴看到您想在编程时使用 SRP。你所做的方式是完全可以接受的。但是,始终存在一个问题,即您想应用这些原则的哪个级别?

此外,在您提供的代码(actionPerformed 方法)中,它不符合 OCP(开放封闭原则),因此设计不佳。相反,对于您拥有的每个组件中的每种类型的事件,我都会有单独的方法。

为了保持代码干燥,你可以有一个方法告诉你当一个组件被选中时要做什么。从您为此组件关联的几个方法(由于不同类型的事件)中委托给此方法。

希望这可以帮助..

于 2011-11-08T20:37:40.297 回答
1

您正在使用一个处理所有事件的位置,这是一个问题。在更大的应用程序中,您将处理不同的事件,应用程序中的不同类将处理不同的事件。组件只侦听它们感兴趣的少数事件,而不是全部。例如, aundo event对 a only 有意义paragraph object,而不对File object, asave event对 themenu object和 the document object.. 等有意义。

理想情况下,您的类会引发某些事件,并且它将允许任何其他类订阅这些事件。发生事件时会通知这些订阅。

我建议您查看观察者设计模式

于 2011-11-08T20:38:29.550 回答
1

请参阅How to Use Actions,它展示了如何Action“用于将功能和状态与组件分开”。Charles Bell 的HTMLDocumentEditor示例展示了如何重用现有操作,以及创建自己的基于AbstractAction.

于 2011-11-08T20:42:44.187 回答