在MVP中,是视图或演示者的onClick责任?

2022-09-02 01:05:07

在 MVP 模式中,谁负责处理 UI 上的点击?
例如,非 MVP 方法将如下所示:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      totalClicks++;
      counterTextView.setText("Total clicks so far: "+totalClicks);
    }
  });

使用MVP是?或者可以处理它?
有人可以澄清这一点吗?onClickPresenterView


答案 1

OnClick 应该调用一个方法。您应该在演示器中开展业务,如果您需要更新UI,则应在中定义一个方法并从演示器调用它。PresenterView

你需要一个方法给你的前任:View

public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}

此外,您的:Presenter

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}

然后像这样重构你的代码:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });

对于更复杂和干净的架构,您可以在交互器中执行用例业务。(在您的示例中,递增计数器值是应用程序的用例)

您可以定义一个交互器,并在其中递增计数器值。

计数器交互器:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}

并重构您的演示器,如下所示:

int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}

使用此方法,您可以将业务逻辑与演示者完全分开,并重新使用您的用例概念,而不会在演示者中复制代码。这是更干净的方法。

还可以检查此 git 存储库,了解不同的 MVP 方法。https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

祝你好运。

编辑:

这是我的轻量级维基百科客户端项目来源:https://github.com/savepopulation/wikilight

我正在尝试实现.(MVP + Dagger2 + RxJava)MVP


答案 2

在 MVP 中,视图负责了解如何捕获点击,而不是决定对点击执行哪些操作。一旦 View 捕获到单击,它必须调用表示器中的相关方法以对其执行操作:

------------------- 视图--------------------

button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));

------------------主持人----------------

public void doWhenButton1isClicked(){
// do whatever business requires
}

我有一系列关于android架构模式的文章,其中第3部分是关于MVP的。您可能会发现它很有帮助。


推荐