Использование шаблона MVP и принципов ОО - PullRequest
2 голосов
/ 07 января 2012

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

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

Спасибовы

1 Ответ

0 голосов
/ 25 января 2013

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

...