单一责任原则和事件听众

时间:2011-11-08 20:17:31

标签: java swing events listeners

我目前正在尝试开发一个简单的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;
    }
}

还有其他课程。 按钮 - 此类用于创建菜单栏的按钮。 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这样庞大而严肃的应用程序时,您会如何编写事件监听器?

3 个答案:

答案 0 :(得分:1)

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

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

要保持代码DRY,您可以使用一种方法来告诉您选择组件时要执行的操作。从您为此组件关联的几种方法(由于不同类型的事件)委派此方法。

希望这会有所帮助..

答案 1 :(得分:1)

您正在使用一个处理所有事件的位置,这是一个问题。在较大的应用程序中,您将以不同方式处理事件,应用程序中的不同类将处理不同的事组件只听取他们感兴趣的一些事件而不是所有事件。例如,undo event只对paragraph object而不是File object有意义,save eventmenu object和{{1}有意义}等等。

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

我建议你看一下Observer Design Pattern

答案 2 :(得分:1)

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