【问题标题】:Java MVC architectureJava MVC 架构
【发布时间】:2017-06-26 10:17:16
【问题描述】:

我正在使用 RMI 开发电子邮件客户端/服务器 Java 应用程序。我设计了基于 MVC 架构的客户端。特别是,我将 Controller 注册为 View 事件侦听器,例如,如果我按下 View 的“收件箱”按钮,Controller 可以通过服务器本身的存根从服务器下载传入的电子邮件。

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

谢谢!!

【问题讨论】:

  • 注册 N 个监听器,每个按钮一个。
  • 怎么样?例如,假设我们在视图中有这样的东西: btn1.addActionListener(controller); btn2.addActionListener(控制器); btn3.addActionListener(控制器);但是Controller类只能实现一个actionPerformed方法。
  • 如果您发布代码而不是描述它,它会更容易提供帮助
  • 请贴出你的观点的代码,我会尽力帮助
  • Controller在做View逻辑就不是MVC了。

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


【解决方案1】:

而不是写 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){
        // ....
    }
}

现在您可以使用匿名ActionListener 委托给正确的方法。例如

btn1.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent ae){
       controller.action1();
   }
});

btn2.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent ae){
       controller.action2(ae);
   }
});

在 Java 8 中,您可以使用方法引用或 lambda 表达式。

Controller controller = new Controller();

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

【讨论】:

  • 超级简单干净!非常感谢!
【解决方案2】:

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

  1. 实现一个监听器并添加条件代码块来决定 用什么方法触发控制器。
  2. 为按钮实现几个侦听器,每个按钮一个侦听器,并直接从它们触发具体的控制器方法。

为什么更好?有时您不仅需要发送事件,还需要从 ui(view) 向控制器发送一些数据包。如果每个操作都有一种方法,则更容易处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2010-11-01
    • 2011-03-29
    • 1970-01-01
    • 2011-02-08
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多