Design patterns 在被动视图模式中创建子视图

Design patterns 在被动视图模式中创建子视图,design-patterns,passive-view,Design Patterns,Passive View,我对使用被动视图模式来提高可测试性非常感兴趣,但我不知道如何调用子对话框 您是否让父视图创建子视图并向父控制器返回一个接口,然后让父控制器创建子控制器?我一直在考虑这个问题,我想我有两个可能的解决方案 将方法添加到视图类以生成从属对话框 创建生成模型、视图的工厂。和从属对话框的控制器 方法1 方法2 我希望我能不止一次地投票支持你的问题。我从未在博客或在线文章中看到过这个看似非常简单的问题。 class ParentView extends JDialog implements IParentV

我对使用被动视图模式来提高可测试性非常感兴趣,但我不知道如何调用子对话框


您是否让父视图创建子视图并向父控制器返回一个接口,然后让父控制器创建子控制器?

我一直在考虑这个问题,我想我有两个可能的解决方案

  • 将方法添加到视图类以生成从属对话框
  • 创建生成模型、视图的工厂。和从属对话框的控制器
  • 方法1 方法2
    我希望我能不止一次地投票支持你的问题。我从未在博客或在线文章中看到过这个看似非常简单的问题。
    class ParentView extends JDialog implements IParentView {
      public IChildView newChildView(...) {
        return new ChildView(...);
      }
      // ...
    }
    
    interface IParentView {
      IChildView newChildView(...);
      // ...
    }
    
    class ParentController {
      private IParentView view;
      public ParentController(IParentView view) {
        this.view  = view;
      }
    
      public void showChildView() {
        IChildView childView = view.newChildView();
        ChildController childController = new ChildController(childView);
        childView.setVisible(true);
      }
    }
    
    class ChildView extends JDialog implements IChildView {
      // ...
    }
    
    interface IChildView {
      void setVisible(boolean visible);
    }
    
    class ChildController {
      private IChildView view;
      public ChildController(IChildView view) {
        this.view = view;
      }
    }
    
    // During testing, create a mock ChildFactory and assign it to instance
    class ChildFactory implements IChildFactory {
        private static IChildFactory instance;
        public static ChildFactory getInstance() {
          if (instance == null) {
            instance = new ChildFactory();
          }
          return instance;
        }
        public static void setInstance(IChildFactory factory) {
          instance = factory;
        }
        public void createChild(IParentView parent) {
          IChildView view = new ChildView(parent);
          ChildController controller = new ChildController(view);
          view.setVisible(true);
        }
    }
    
    interface IChildFactory {
      void createChild(IParentView parent);
    }
    
    class ParentController {
      private IParentView view;
      public ParentController(IParentView view) {
        this.view  = view;
      }
      public void showChildView() {
        ChildFactory.getInstance().createChild(view);
      }
    }
    
    // ParentView class similar to method 1