2

我试图在使用 MVP 模式的场景中应用面向对象编程的原则。我有 4 个解决方案,最后两个我更喜欢。然而,大多数解决方案都打破了某些原则,如 SRP、IOC / DIP、开闭原则等。

简而言之,我希望查看者和演示者可以有一个可选的行为。此行为允许查看器拥有一个窗口或包含在一个面板中。在我看来,查看者应该了解 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();     
    }           
}

谢谢

4

1 回答 1

0

解决方案 1 更多的是关于组合而不是适配器。比解决方案 2 更喜欢解决方案 1,因为组合比继承更灵活。

于 2013-01-25T01:50:29.003 回答