Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MVC体系结构_Java_Design Patterns_Model View Controller - Fatal编程技术网

Java MVC体系结构

Java MVC体系结构,java,design-patterns,model-view-controller,Java,Design Patterns,Model View Controller,我正在用RMI开发一个电子邮件客户机/服务器java应用程序。我设计了基于MVC架构的客户端。特别是,我已将控制器注册为视图事件侦听器,因此,例如,如果我按下视图的“收件箱”按钮,控制器可以通过服务器本身的存根下载来自服务器的传入电子邮件 所有这一切的结果是,控制器在按下的按钮名称上充满了条件代码块,这是非常糟糕的。有人能给我推荐一种替换条件块的方法吗?我考虑过使用一些设计模式,但我不知道在这种情况下哪一种是最好的 谢谢 假设视图上有两个按钮,分别为“发送”和“关闭” 我认为最好在控制器内部有两

我正在用RMI开发一个电子邮件客户机/服务器java应用程序。我设计了基于MVC架构的客户端。特别是,我已将控制器注册为视图事件侦听器,因此,例如,如果我按下视图的“收件箱”按钮,控制器可以通过服务器本身的存根下载来自服务器的传入电子邮件

所有这一切的结果是,控制器在按下的按钮名称上充满了条件代码块,这是非常糟糕的。有人能给我推荐一种替换条件块的方法吗?我考虑过使用一些设计模式,但我不知道在这种情况下哪一种是最好的


谢谢

假设视图上有两个按钮,分别为“发送”和“关闭” 我认为最好在控制器内部有两种方法,例如
controller.onCloseClicked()
controller.onSendClicked()
。这样,您可以使用两个选项:

  • 实现一个侦听器并添加条件代码块以决定 用什么方法来控制火势
  • 为按钮实现几个监听器,每个按钮一个监听器,并直接从这些监听器中激发具体的控制方法

  • 为什么更好?有时,您不仅需要发送事件,还需要从ui(视图)向控制器发送一些数据包。当每个动作有一个方法时,处理起来更容易。

    而不是编写if/else语句

    public class Controller implements ActionListener {
    
        public void actionPerformed(ActionEvent ae){
            if(....) {
               // action1
            } else if(...){
               // action2      
            }
        }
    }
    
    将每个分支放在自己的方法中。例如

    public class Controller {
    
        public void action1(){
            // ....
        }
    
        public void action2(ActionEvent ae){
            // ....
        }
    }
    
    btn1.addActionListener(new ActionListener(){
    
       public void actionPerformed(ActionEvent ae){
           controller.action1();
       }
    });
    
    btn2.addActionListener(new ActionListener(){
    
       public void actionPerformed(ActionEvent ae){
           controller.action2(ae);
       }
    });
    
    现在,您可以使用匿名
    ActionListener
    委托给正确的方法。例如

    public class Controller {
    
        public void action1(){
            // ....
        }
    
        public void action2(ActionEvent ae){
            // ....
        }
    }
    
    btn1.addActionListener(new ActionListener(){
    
       public void actionPerformed(ActionEvent ae){
           controller.action1();
       }
    });
    
    btn2.addActionListener(new ActionListener(){
    
       public void actionPerformed(ActionEvent ae){
           controller.action2(ae);
       }
    });
    
    在Java8中,可以使用方法引用或lambda表达式

    Controller controller = new Controller();
    
    btn1.addActionListener(controller::action1);
    btn2.addActionListener(ae -> controller.action2());
    

    注册N个监听器,每个按钮一个。如何注册?例如,假设视图中有类似的内容:btn1.addActionListener(控制器);btn2.addActionListener(控制器);btn3.addActionListener(控制器);但是控制器类只能实现一个actionPerformed方法。如果你发布代码而不是描述它,那么会更容易帮助请发布视图的代码,我会尝试帮助如果控制器正在执行视图逻辑,那么它不是MVC。超级简单和干净!谢谢!