8

我需要视图来保存对控制器的引用,因为它需要将控制器注册为事件侦听器。我需要控制器来保存对视图的引用,因为单击按钮后,我需要能够在列表中获取选定的文件。(我有一个文件列表和一个“添加集群”按钮,所以当单击该按钮时,我需要获取选定的文件)

简而言之,我有:

Controller controller(view);
View view(controller);

我敢肯定这里有一些不好的设计,我只是不知道如何避免它..

4

5 回答 5

5

我不确定您使用的是什么 Java 技术,但在 GWT 应用程序中 - 并使用 MVP 模式 - 视图不需要引用控制器:控制器(或演示者)和视图之间的所有通信是通过 View 实现的接口实现的。在您的特定情况下,您的代码应如下所示:

定义一个显示接口:

public interface Display {
    public void registerEventListener(Listener aListener)
    public List getSelectedFiles ()
}

让 View 实现该接口:

public class View implements Display{
//The method implementations
}

并在控制器中进行所有必要的绑定:

public class Controller{
    private Display view;
    public Controller(){
        //Or use some DI technology
        this.view = new View();
        //Get a Listener implementation, maybe an Anonymous Inner Class
        this.view.registerEventListener(getListener());
    }

    public void processFiles(){
        List files = view.getSelectedFiles();
        //Do the processing here
    }

}
于 2012-06-02T20:21:08.193 回答
4

一种可能的解决方案:

  • 简单地给Controller一个addView(View view)方法
  • 同样对于 View 给它一个addController(Controller controller)方法。
  • 使其成为您的文档的一部分,这些必须在使用前进行设置。
  • 确保在使用它们之前检查引用变量不为空,因为它们不会在构造函数中设置。
于 2012-06-02T19:31:15.523 回答
1

好吧,我相信您可以使用封装以及延迟初始化过程。我相信您在控制器初始化时不需要视图,反之亦然。如果不是,您也可以将上述答案与 bean 的惰性初始化属性结合使用。

于 2012-06-02T19:35:02.463 回答
0

要正确绑定视图和控制器,请右键单击 *.aspx 页面并选择“转到控制器”菜单。现在在受人尊敬的控制器中添加一个具有以下语法的方法。

public ActionResult viewName()
{
   return view()
}  

其中 viewname 是前视图的名称。在 .net 中,它是没有 aspx 扩展名的页面名称 现在,当您右键单击视图并选择菜单“转到查看”时,这会将您移动到受尊重的页面,这确认您的视图和控制器已很好地绑定。

于 2012-06-05T08:19:10.047 回答
0

创建四个部分:1-Control 2-Model 3-View 4-ViewInterface

第 4 节是 Control 和 View 之间的中间层。当您初始化 View 时初始化 IControl 接口,如

IControl control = new ControlUtil((IViewUtil(new ViewUtil());

您将视图界面传递给要使用的控件。当视图想要调用控件时,就像在说“嘿控件做某事,这是我的界面,以防你需要它。

于 2018-07-16T07:00:35.383 回答