Java 很好的MVC设计,可以让许多类调用一个方法
编辑(2013年5月16日): 我将使用第三种解决方案。谢谢大家的帮助 编辑结束(2013年5月16日) 我有一个带有更新方法的视图(在控制器内部)。该方法必须由许多类调用。所以我想出了两个解决方案: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
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());
}
}