在MVC中的类之间传递消息的正确方法是什么?

时间:2014-11-26 03:51:16

标签: java swing oop design-patterns model-view-controller

public void Model {
    private SwingPropertyChangeSupport spcs;
    public void updatedb();
    public void addPropertyChangeListener(PropertyChangeListener listener)
}
public void Gui {
    private JFrame view;
    Gui() {
       view = new JFrame();  
       init();// for initilizing ui components
       EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    view.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });  
    }
    void addListener(ActionListener a);
    void init();
    void updateGUI();
}

public void Controller implements ActionListener,PropertyChangeListener {
     Model m;
     Gui g;
     public void PropertyChange(PropertyChangeEvent e);
     public void actionPerformed(ActionEvent e)
     Controller(Model m,Gui g){}

}
  1. 在3个类之间传递消息的正确方法是什么MVC message passsing Image如何为多个控制器和视图扩展它?我已经读过SO回答The MVC pattern and SWING说这个实现效率不高?

  2. 是否使用Controller ActionListener和PropertyChangeListener是正确的?当我在actionperformed()中调用updatedb()时,它是否会使GUI缓慢?我还阅读了有关Controller的引用的View,它将gui动作映射到模型动作。这种方式更有效吗?

  3. CodeQueue.invokeLater中应该包含哪部分代码?将init()函数放在run()之外是对的吗?或者我应该将整个gui类包装在run?中吗?


  4. EventQueue.invokeLater(new Runnable() {
    
        public void run() {
            try {
                Gui view = new Gui();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    

1 个答案:

答案 0 :(得分:4)

  

在3个类之间传递消息的正确方法是什么?MVC消息传递Image如何为多个控制器和视图扩展它?我已经阅读了SO答案MVC模式和SWING说这个实现效率不高?

这归结为需求,就个人而言,我为每个级别定义合同/接口,并提供对每个子级别的引用。也就是说,模型和控制器都有一个合同,每个合同必须满足,视图和控制器都有一个合同,每个合同都必须满足,以便于沟通。

这允许一对一的通信管道,它也可以分离每一层,因为他们不关心对方是如何实现的。

同样,您可以使用某种Observer Pattern,它允许感兴趣的各方将自己注册到某个对象,以便在发生某些更改时通知他们。通常,这会为可观察对象创建与许多观察者的单向通信。

  

创建Controller ActionListener和PropertyChangeListener是否正确?

就个人而言,控制器应该尽可能少地了解UI的物理实现方式。如果您的查看者合同提供了ActionListener和/或PropertyChangeListener支持,那没关系,但如果您依赖于底层实施对象,那可能不太好想法(恕我直言) - 它增加了耦合。

  

当我在actionperformed()中调用updatedb()时,它会使GUI缓慢吗?

在GUI的主线程(例如,Swing中的事件调度线程)的上下文中执行的任何操作都将阻止UI响应其事件队列中的新事件。阻止GUI主线程运行的时间越长,UI的响应性就越低。简短的回答,不要通过长时间运行或阻止进程来阻止GUI的主线程......

  

我还阅读了有关Controller的参考的View,它将gui动作映射到模型动作。这种方式更有效吗?

一般来说,视图和模型实际上不应该相互通信,它们会假设通过控制器进行通信。视图和控制器需要彼此了解,模型和控制器需要了解每个。

知识的数量将取决于合同的要求,例如,如果您使用Observer Pattern,则可观察对象不需要了解有关观察者的任何信息(除此之外他们有一个或多个可以调用的方法)

  

CodeQueue.invokeLater中应该包含哪部分代码?将init()函数放在run()之外是对的吗?或者我应该将整个gui类包装在run?中吗?

创建或修改UI或UI组件的任何代码都必须在GUI主线程的上下文中运行。

您还可以查看Implementing the Controller part of MVC in Java SwingJava and GUI - Where do ActionListeners belong according to MVC pattern?,了解有关Swing中MVC的更多讨论......