java - MVP设计模式最佳实践

标签 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模式更正确的实现?为什么?

最佳答案

我的简短回答:

我会说第一个。

我的长答案:

基本上 MVP 有两个变体:Passive ViewSupervising Presenter

您的伪类创建了被动 View 的实现。

要查看差异:Please check the first answer here .对它们以及它们之间的区别进行了完美的描述,因此我认为这里没有必要复制这些内容。

我回答的原因:

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

基于此,当按钮被按下时, View 不应该知道它应该提供输入文本框中的值。它只是应该通知演示者按钮已按下,并为演示者公开 getter 以收集它想要的任何用户输入。

关于java - MVP设计模式最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360783/

相关文章:

java - 具体类的多个实例与抽象类的多个实现

javascript - 为什么 YUI.lang.extend 以这种方式实现继承?

javascript - 无需点击 'li' 即可运行函数

java - 使用jOOQ构建SQL时如何将变量绑定(bind)到条件语句?

java - Spring 数据休息 : Can we rename the "content" property in pagination result?

java - 根据长度乘以该数字

时间:2019-04-01 标签:c#comboboxwinform

c# - DirectoryInfo 不创建目录

java - 我可以注释从父类(super class)继承的成员吗?

c# - 多个数据库上的 PetaPoco