【问题标题】:MVP design pattern best practice [closed]MVP 设计模式最佳实践 [关闭]
【发布时间】:2016-05-21 08:49:28
【问题描述】:

考虑以下实现 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模式更正确的实现?为什么?

【问题讨论】:

  • Code Review 可能是这个问题的一个更好的地方,你会在那里得到一些很好的答案:codereview.stackexchange.com
  • @Jezzabeanz 他需要真正的代码,而不是伪代码。
  • 不征求意见怎么能征求意见?

标签: java c# oop design-patterns mvp


【解决方案1】:

我的简短回答:

我会说第一个。

我的长答案:

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

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

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

我回答的原因:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多