2012-01-07 47 views
2

我試圖在使用MVP模式的場景中應用面向對象編程的原則。 我有4個解決方案,最後兩個我更喜歡。然而,大多數解決方案將SRP,IOC/DIP,開放閉合原理等某些原理分解。使用MVP模式和麪向對象原理

簡而言之,我希望查看器和演示者可以具有可選行爲。這種行爲允許觀看者有一個窗口或被包含在一個面板中。 在我看來,觀衆應該瞭解JFrame和聽衆,當觀衆支持所選的窗口行爲時,窗口化的演示者應該執行一些額外的操作。

你能幫我找到最適合這種情況的設計嗎?我相信這些例子將明確需要。

溶液1 - 適配器一樣

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

解決方案2 - 使用繼承

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

解決方案3 - 使用窗口處理

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() { 
    } 
} 

解決方案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();  
    }   
} 

謝謝

+0

在提出解決方案之前,有助於瞭解問題所在。你能解釋一下你想解決什麼問題,而不是通過閱讀4個長長的代碼來猜測它是什麼嗎? – 2012-01-07 20:42:06

+0

我改進了這個問題。 – ConradoQG 2012-01-07 20:57:11

+2

太抽象了,需要更實際 – Daniel 2012-01-22 20:35:06

回答

0

解決方案1是更多的成分,而不是適配器。 比解決方案2更喜歡解決方案1,因爲組合比繼承更靈活。