MVP设计模式的最佳实践

时间:2016-05-21 08:49:29

标签: java c# oop design-patterns mvp

考虑以下实现MVP模式的伪代码:

interface Presenter {
    void onSendClicked();
}

interface View {
    String getInput();
    void showProgress();
    void hideProgress();
}

class PresenterImpl implements Presenter {
    // ...ignore other implementations
    void onSendClicked() {
        String input = view.getInput();
        view.showProgress();
        repository.store(input);
        view.hideProgress();
    }
}

class ViewImpl implements View {
    // ...ignore other implementations
    void onButtonClicked() {
        presenter.onSendClicked();
    }

    String getInput() {
        return textBox.getInput();
    }

    void showProgress() {
        progressBar.show();
    }

    void hideProgress() {
        progressBar.hide();
    }
}

这是MVP模式的另一种实现方式:

interface Presenter {
    void saveInput(String input);
}

interface View {
    void showProgress();
    void hideProgress();
}

class PresenterImpl implements Presenter {
    // ...ignore other implementations
    void saveInput(String input) {
        view.showProgress();
        repository.store(input);
        view.hideProgress();
    }
}

class ViewImpl implements View {
    // ...ignore other implementations
    void onButtonClicked() {
        String input = textBox.getInput();
        presenter.saveInput(intput);
    }

    void showProgress() {
        progressBar.show();
    }

    void hideProgress() {
        progressBar.hide();
    }
}

哪一个更正确实现MVP模式?为什么呢?

1 个答案:

答案 0 :(得分:2)

我的简短回答:

我会说第一个。

我的答案很长:

基本上,MVP有两种变体:被动视图监督演示者

您的伪类会创建被动视图的实现。

要看到差异:Please check the first answer here。它完美地描述了它们和它们之间的区别,因此我认为不需要在这里复制内容。

我回答的原因:

被动视图的主要思想是让视图尽可能愚蠢。它只是在发生一些用户操作时通知其演示者,并公开访问者和变更器以从GUI获取和设置值。所有这些都是为了在视图级别上实现最大可测试性。

基于此,视图不应该知道它应该在按下按钮时提供输入文本框中的值。它应该通知演示者按下按钮并向演示者公开getter以收集它想要的任何用户输入。