2012-01-07 4 views
2

Я пытаюсь применить принципы объектно-ориентированного программирования в сценарии, использующем шаблон MVP. У меня было 4 решения, а в последних двух мне понравилось больше. Однако большинство решений ломают определенные принципы как SRP, IOC/DIP, принцип открытого закрывания и т. Д.Использование шаблонов MVP и принципов OO

Вкратце, я хочу, чтобы зритель и ведущий могли иметь необязательное поведение. Такое поведение позволяет зрителю иметь окно или находиться в одной панели. На мой взгляд, зритель должен знать 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() { 
    } 
} 

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

Спасибо

+0

Прежде чем предлагать решение, это поможет узнать, в чем проблема. Не могли бы вы объяснить, какую проблему вы хотите решить, а не заставить нас угадать, что это такое, читая 4 длинных фрагмента кода? –

+0

Я улучшил вопрос. – ConradoQG

+2

Слишком абстрактно, нужно быть немного более практичным – Daniel

ответ

0

Решение 1 больше о композиции, а не адаптер. предпочитают решение 1 над раствором 2, поскольку композиция является более гибкой, чем наследование.

 Смежные вопросы

  • Нет связанных вопросов^_^