2012-01-07 1 views
2

J'essaie d'appliquer les principes de la programmation orientée objet dans un scénario utilisant le modèle MVP. J'ai eu 4 solutions, et les deux dernières m'ont plu plus. Cependant la plupart des solutions décomposent certains principes comme SRP, IOC/DIP, principe ouvert-fermé, etc.Utilisation du modèle MVP et des principes OO

En bref, je veux que le spectateur et le présentateur aient un comportement optionnel. Ce comportement permet au visualiseur d'avoir une fenêtre ou d'être contenu dans un panneau. À mon avis, le spectateur devrait avoir une connaissance du JFrame et des auditeurs, le présentateur fenêtré devrait effectuer des actions supplémentaires lorsque le spectateur prend en charge le comportement de la fenêtre choisie.

Pouvez-vous m'aider à trouver le meilleur design pour cette situation? Je crois que les exemples montreront clairement le besoin.

Solution 1 - Adaptateur comme

public class Main { 

    public static void main(String[] args) { 
     ConcreteWindowedView view = new ConcreteWindowedView(); 
     Presentable presenter = new ConcreteWindowedPresenter(view); 
     presenter.present(); 
    } 
} 

public interface Presentable { 
    public void present(); 
} 

public interface Viewable { 
    public void view(); 
} 

public class ConcreteView implements Viewable { 
    private Container container; 
    public ConcreteView(Container container) { 
     this.container = container; 
    } 
    public void view() { 
     // Configure UI (TextBox, Buttons) inside container; 
    } 
} 

public class ConcretePresenter implements Presentable { 
    private Viewable viewable; 
    public ConcretePresenter(Viewable viewable) { 
     this.viewable = viewable; 
    } 
    public void present() { 
     // Configure presenter; 
     viewable.view(); 
     // Register UI action listener 
    } 
} 

public class ConcreteWindowedView implements Viewable { 
    private ConcreteView contentView; 
    private JFrame frame; 
    public ConcreteWindowedView() { 
     frame = new JFrame(); 
     contentView = new ConcreteView(frame.getContentPane()); 
    } 
    public void view() {     
     contentView.view(); 
    } 
    public void addWindowListerner() { 

    }  
} 

public class ConcreteWindowedPresenter implements Presentable { 
    private ConcreteWindowedView windowedView; 
    private ConcretePresenter concretePresenter; 
    public ConcreteWindowedPresenter(ConcreteWindowedView windowedView) { 
     this.windowedView = windowedView; 
     this.concretePresenter = new ConcretePresenter(windowedView); 
    } 
    public void present() { 
     // Configure presenter 
     concretePresenter.present(); 
     // Register window listeners 
     this.windowedView.addWindowListerner(); 
    } 
} 

Solution 2 - héritage Utilisation

public class Main { 

    public static void main(String[] args) { 
     ConcreteWindowedView view = new ConcreteWindowedView(); 
     Presentable presenter = new ConcreteWindowedPresenter(view); 
     presenter.present(); 
    } 
} 

public interface Viewable { 
    public void view(); 
} 
public interface Presentable { 
    public void present(); 
} 
public class ConcreteView implements Viewable { 
    protected Container container; 
    protected ConcreteView() { 
    } 
    public ConcreteView(Container container) { 
     this.container = container; 
    } 
    public void view() { 
     // Configure UI (TextBox, Buttons) inside container; 
    } 
} 

public class ConcreteWindowedView extends ConcreteView { 
    public JFrame frame; 
    public ConcreteWindowedView() { 
     frame = new JFrame(); 
     container = frame.getContentPane(); 
    } 
    public void view() { 
     // Configure view 
     super.view(); 
     // Show JFrame 
    } 
    public void addWindowListerner() { 
    } 
} 

public class ConcretePresenter implements Presentable { 
    Viewable viewable; 
    public ConcretePresenter(Viewable viewable) { 
     this.viewable = viewable; 
    } 
    public void present() { 
     // Configure presenter; 
     viewable.view(); 
     // Register UI action listener 
    } 
} 

public class ConcreteWindowedPresenter extends ConcretePresenter { 
    private ConcreteWindowedView concreteWindowedView; 
    public ConcreteWindowedPresenter(ConcreteWindowedView viewable) { 
     super(viewable); 
     this.concreteWindowedView = viewable; 
    } 
    public void present() { 
     // Configure presenter 
     super.present(); 
     // Register window listeners 
     this.concreteWindowedView.addWindowListerner(); 
    } 
} 

Solution 3 - Utilisation d'un gestionnaire de fenêtre

public class Main { 

    public static void main(String[] args) { 
     Viewable view = new ConcreteView(); 
     Presentable presenter = new ConcretePresenter(view, new WindowViewHandler(view)); 
     presenter.present(); 
    } 
} 

public interface Viewable { 
    public void view(); 
    public void setContainer(Container container); 
} 

public interface Presentable { 
    public void present(); 
} 

public class ConcreteView implements Viewable { 
    Container container; 
    public ConcreteView() { 
    } 
    public ConcreteView(Container container) { 
     this.container = container; 
    }   
    public void view() { 
     if (container == null) 
      throw new RuntimeException("Container not set."); 
     // Configure UI (TextBox, Buttons) inside container; 
    } 
    public void setContainer(Container container) { 
     this.container = container; 
    } 
} 

public class ConcretePresenter implements Presentable { 
    Viewable viewable; 
    WindowViewHandler windowHandler; 
    public ConcretePresenter(Viewable viewable) { 
     this.viewable = viewable; 
    } 
    public ConcretePresenter(Viewable viewable, WindowViewHandler windowHandler) { 
     this(viewable); 
     this.windowHandler = windowHandler; 
    } 
    public void present() {   
     // Configure presenter   
     if (windowHandler != null) 
      windowHandler.addWindowListerner(); 

     this.viewable.view();      
    } 
} 

public class WindowViewHandler { 

    Viewable viewable; 
    JFrame frame; 

    public WindowViewHandler(Viewable viewable) { 
     this.viewable = viewable; 
     initWindow(); 
    } 

    private void initWindow() { 
     frame = new JFrame(); 
     viewable.setContainer(frame.getContentPane()); 
    } 

    public void addWindowListerner() { 
    } 
} 

Solution 4

public class Main { 

    public static void main(String[] args) { 
     ConcreteWindowedView view = new ConcreteWindowedView(); 
     Presentable presenter = new ConcretePresenter(view); 
     presenter.present(); 
    } 
} 
public interface Windowable { 
    public void addWindowListerner(); 
} 
public interface Viewable { 
    public void view(); 
    public void setContainer(Container container); 
} 
public interface Presentable { 
    public void present(); 
} 
public class ConcreteView implements Viewable { 
    Container container; 
    public ConcreteView() { 
    } 
    public void setContainer(Container container) { 
     this.container = container; 
    } 
    public void view() { 
     if (container == null) 
      throw new RuntimeException("Container not set."); 
    } 
} 
public class ConcreteWindowedView extends ConcreteView implements Windowable { 
    JFrame frame; 
    public ConcreteWindowedView() { 
    } 
    public void view() { 
     frame = new JFrame(); 
     super.setContainer(frame.getContentPane()); 
     super.view(); 
    }   
    public void addWindowListerner() {  
    } 
} 
public class ConcretePresenter implements Presentable { 
    Viewable viewable; 
    ConcreteWindowedView concreteWindowedView; 
    public ConcretePresenter(Viewable viewable) { 
     this.viewable = viewable; 
    } 
    public ConcretePresenter(ConcreteWindowedView concreteWindowedView) { 
     this.viewable = concreteWindowedView; 
     this.concreteWindowedView = concreteWindowedView; 
    } 
    public void present() { 
     // Configure presenter   
     if (concreteWindowedView != null) 
      concreteWindowedView.addWindowListerner(); 

     this.viewable.view();  
    }   
} 

Merci

+0

Avant de suggérer une solution, il serait utile de savoir quel est le problème. Pourriez-vous expliquer quel problème vous voulez résoudre, plutôt que de nous faire deviner ce que c'est en lisant 4 longs morceaux de code? –

+0

J'ai amélioré la question. – ConradoQG

+2

Trop abstrait, doit être un peu plus pratique – Daniel

Répondre

0

Solution 1 est plus sur la composition plutôt que l'adaptateur. préfèrent la solution 1 à la solution 2 car la composition est plus flexible que l'hérédité.

Questions connexes