我需要视图来保存对控制器的引用,因为它需要将控制器注册为事件监听器。 我需要控制器来保存对视图的引用,因为在按钮单击时,我需要能够在列表中获取所选文件。 (我有一个文件列表和一个按钮'添加群集',所以当点击按钮时我需要获取所选文件)
所以总之我有:
Controller controller(view);
View view(controller);
我确定这里有一些不好的设计,我只是想不通如何避免它..
答案 0 :(得分:5)
我不确定您使用的Java技术,但在GWT应用程序中 - 并且使用MVP模式 - 不需要View来引用Controller:Controller(或Presenter)之间的所有通信View是通过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
}
}
答案 1 :(得分:3)
一种可能的解决方案:
addView(View view)
方法addController(Controller controller)
方法。 答案 2 :(得分:1)
好吧,我相信你可以使用封装和懒惰的初始化过程。我确信你在控制器初始化的同一时刻不需要View,反之亦然。如果不是,你也可以将上面的答案与bean的lazy init属性结合起来。
答案 3 :(得分:0)
要正确绑定视图和控制器,请右键单击* .aspx页面并选择“转到控制器”菜单。现在在受尊敬的控制器中添加一个具有以下语法的方法。
public ActionResult viewName()
{
return view()
}
其中viewname是ex的视图名称。在.net中它是没有aspx扩展名的页面名称现在,当您右键单击视图并选择菜单“Go to view”将移动到尊重页面时,这确认您已查看并且控制器已绑定好。
答案 4 :(得分:0)
创建四个部分: 一控 2模型 3视图 4-ViewInterface
第4节是“控件”和“视图”之间的中间层。 初始化View时,初始化
之类的IControl接口IControl control = new ControlUtil((IViewUtil(new ViewUtil());
您通过视图界面来使用控件。 当视图要调用控件时,就像在说:“嘿,控件要做一些事情,这是我的界面,以备不时之需。