Java 很好的MVC设计,可以让许多类调用一个方法

Java 很好的MVC设计,可以让许多类调用一个方法,java,model-view-controller,Java,Model View Controller,编辑(2013年5月16日): 我将使用第三种解决方案。谢谢大家的帮助 编辑结束(2013年5月16日) 我有一个带有更新方法的视图(在控制器内部)。该方法必须由许多类调用。所以我想出了两个解决方案: 在需要调用update方法的每个类中为视图/控制器创建一个字段 将更新方法设为静态 如果两个或多个类同时调用update方法,会发生什么情况 简化示例1: public class View{ public void update(){} } // Many classes: publi

编辑(2013年5月16日):

我将使用第三种解决方案。谢谢大家的帮助

编辑结束(2013年5月16日)

我有一个带有更新方法的视图(在控制器内部)。该方法必须由许多类调用。所以我想出了两个解决方案:

  • 在需要调用update方法的每个类中为视图/控制器创建一个字段
  • 将更新方法设为静态
  • 如果两个或多个类同时调用update方法,会发生什么情况

    简化示例1:

    public class View{
        public void update(){}
    }
    
    // Many classes:
    public class AClass{
        private View view;
    
        private void aMethod(){
            view.update();
        }
    }
    
    简化示例2:

    public class View{
        public static void update(){}
    }
    
    // Many classes:
    public class AClass{
    
        private void aMethod(){
            View.update();
        }
    }
    
    编辑(2013年5月12日):我同意,“静态解决方案”不好,特别是对于OOP

    我简化了一点,所以这里是实际的设计:

    假设您有一些MVC设计的程序,并希望将它们组合在一个“大”程序中,但现在这些程序必须不时进行交互

    public class AView{
        public void update(){}
    }
    
    public class AModel{}
    
    //Many of these:
    public class AController{
        private AView aview;
        private AModel amodel;
    
        public AController(AView aview, AModel amodel){
            this.aview=aview;
            this.amodel=amodel;
        }
    }
    
    public class MainController{
        public MainController(){
            AView view1 = new AView();
            AModel model1 = new AModel();
            AController controller1 = new AController(view1, model1);
    
            AView view2 = new AView();
            AModel model2 = new AModel();
            AController controller2 = new AController(view2, model2);
    
            AView view3 = new AView();
            AModel model3 = new AModel();
            AController controller3 = new AController(view3, model3);
        }
    }
    
    现在让我们假设controller1和controller2需要调用view3的update方法。 我目前的解决方案是在controller1和controller2中创建一个视场3(如您所建议的)

    或者我应该重构整个设计还是在控制器之间建立一座“桥梁”?那“桥”会是什么样子

    编辑结束(2013年5月12日)

    编辑(14.05.2013): 我想出了第三个解决方案: 每个控制器触发自己的事件。例如:

    Controller1和Controller2触发事件,Controller3侦听这些事件,然后调用View3的更新方法。 你觉得这个解决方案怎么样


    <强>编辑结束(1405.2013)/P>>P>抛出静态解决方案,只是不要考虑这一点,因为这样做,你把所有OOP扔出窗口。为控件提供一个public

    update()
    方法,该方法在需要时调用视图的方法

    尽管如此,您的问题还是让我对紧密耦合感到担忧

    这些需要调用视图更新的其他类——它们是控件类/库的一部分吗?只有控件应该在视图上调用更新


    编辑,您可以声明:


    请您解释一下“静态方法将所有OOP抛出窗口”的更多内容,我很想了解这一点


    当您将方法设置为静态时,它不再是可继承的,更重要的是,它不再是类实例的方法,而是类对象的方法。因此,单独的实例将不再有自己独特的方法可调用,它无法从实例获取状态数据,也无法更改实例的状态

    我希望整个模型将更新相同的视图,并针对各种数据保持更新

    public class View{
         private View(){}
         public void update(){}
         private static class singleTonFactory{
              private Static View obj = new View();
         }
    
         public static View getViewInstance (){
              return singleTonFactory.obj;
         }
    }
    
    
     // Many classes:
    public class AClass{
         private final View view = View.getViewInstance();
    
         private void aMethod(){
              view.update();
         }
     }
    

    我将使用以下设计,因为它将是模块化的(感谢@Hovercraft-Full-Of-Eels指出紧密耦合):


    非常感谢您的评论。

    这取决于您是否需要
    视图的内部状态。如果将其设置为静态,则需要将整个状态设置为静态-这显然是代码的味道。如果您不需要状态,那么每个类都应该有自己的
    视图的实例。如果您需要共享状态,那么在您决定如何共享该类的实例之前,您需要回答自己的问题“如果两个或多个类同时调用update方法会发生什么情况”。请您解释更多关于“静态方法将所有OOP抛出窗口”的内容,我很想了解这一点。所以请。
    
    public class View{
         private View(){}
         public void update(){}
         private static class singleTonFactory{
              private Static View obj = new View();
         }
    
         public static View getViewInstance (){
              return singleTonFactory.obj;
         }
    }
    
    
     // Many classes:
    public class AClass{
         private final View view = View.getViewInstance();
    
         private void aMethod(){
              view.update();
         }
     }
    
    public class MainController{
    
        private Controller1 controller1;
        private Controller2 controller2;
        private Controller3 controller3;
    
        public MainController(){
            controller1=new Controller1();            
            controller2=new Controller2();           
            controller3=new Controller3();
    
            addListeners();
        }
    
        private class Ctrl1Listener implements Controller1Listener(){        
            public void controller1ActionPerformed(Controller1Event e){
                //Calls the method of view3     
                controller3.update();
            }
        }
    
        private class Ctrl2Listener implements Controller2Listener(){           
            public void controller2ActionPerformed(Controller2Event e){
                //Calls the method of view3     
                controller3.update();
            }
        }
    
        private void addListeners(){
            controller1.addListener(new Ctrl1Listener());
            controller2.addListener(new Ctrl2Listener());
        }
    }