Domanda

Sono molto interessato ad utilizzare il modello Vista passiva per migliorare la verificabilità, ma non sono sicuro come chiamare le finestre di dialogo del bambino.

Avete vista padre creare la vista del bambino e tornare un'interfaccia per il controller genitore, allora hai il controller genitore creare il controller bambino?

È stato utile?

Soluzione

Ho riflettuto su questo molto e penso di avere un paio di possibili soluzioni.

  1. Aggiungere un metodo alla classe di visualizzazione per generare la finestra di dialogo subordinato
  2. Crea una fabbrica che genera il modello, vista. e controller per la finestra di dialogo subordinato

Metodo 1

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

Metodo 2

// 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top