有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MVC循环依赖

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

简言之,我有:

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

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


共 (5) 个答案

  1. # 1 楼答案

    一种可能的解决办法:

    • 只需给控制器一个addView(View view)方法
    • 同样,对于视图,给它一个addController(Controller controller)方法
    • 在使用前,必须将其设置为文档的一部分
    • 请确保在使用引用变量之前检查它们是否为null,因为它们不会在构造函数中设置
  2. # 2 楼答案

    我相信您可以使用封装和延迟初始化过程。我确信,当控制器初始化时,您不需要同时使用视图,反之亦然。如果不是,您还可以结合bean的lazy init属性来回答上述问题

  3. # 3 楼答案

    创建四个部分: 1-控制 2-模型 三视图 4视图界面

    第四部分是控制和视图之间的中间层。 初始化视图时,初始化IControl接口,如

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

    将视图界面传递给要使用的控件。 当view want调用control时,就像说“嘿,control,做点什么吧,这是我的界面,以防您需要它。”

  4. # 4 楼答案

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

    public ActionResult viewName()
    {
       return view()
    }  
    

    其中viewname是您的视图的名称,例如。net这是不带aspx扩展名的页面的名称,此时您将右键单击视图并选择菜单“转到视图”,这将使您移动到受尊重的页面。这确认您的视图和控制器已绑定良好

  5. # 5 楼答案

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

    定义显示接口:

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

    让视图实现该接口:

    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
        }
    
    }