MVP Android – 有多less演示者?

我有一个快速的问题。 我正在尝试(和挣扎)用MVPdevise模式来devise我的应用程序。

我可以问,每个视图(活动,片段)我应该有一个单独的主持人类吗?

我可以在网上看到的资源不是很多,很明显用样本说明了MVP。 任何人都可以分享,如果有一些?

PS我也在这个应用程序中使用RecyclerViewAdapter所以任何指针,将不胜感激

提前致谢

Related of "MVP Android – 有多less演示者?"

模型 – 视图 – 控制器devise在软件devise中出现得非常早,最初用于button元素等。 您使用MVP(基本上与MVC相同)来实现模块化的架构,从而易于维护,将逻辑的表示从逻辑中分离出来。

鉴于你的问题,我想你真的想要一个类每个视图。 这将是最常见的方法。

http://antonioleiva.com/mvp-android/给出了MVP的理论概述。

虽然老了,这是非常有趣的问题。 从现在开始,MVP / MVC / MVVM就是Android社区里的一种“嗡嗡声”,这个问题值得一个更完整的答案(恕我直言)。

简短的回答:

单个演示者可以使用多个视图

很长的回答:

一般来说,MVP / MVC没有单一的定义 – 有很多方法来实现这些架构模式。 你没有提供“你的”MVP的定义,所以我只能猜测你的想法。

也就是说,面向对象编程中有一些“最佳实践”,任何架构模式的实现都应该(理想地)考虑在内。

你问的是,你是否可以重复使用不同视图的主持人实现,对吗? 我们通过SOLID原则的棱镜来看这个问题。

“L”代表Liskov替代原则(LSP)。 这是SOLID中最被误解的原则之一,但是这个原则背后的总体思想是:

LSP:如果一段代码与A类对象一起工作,它也应该与A的任何子类的对象无缝地工作(即子类必须是可用的而不是A到处)

Android中LSP违例的例子是ContextContext (例如ApplicationActivity )是不等价的。 一些需要Context代码可以和Application无缝地协同工作,但是如果你传递Activity ,会发生内存泄漏(这在Android应用程序中是非常普遍的错误,这主要是由于Google的开发者违反了LSP)。

回到顶端你的问题。 我假设你的演示者看起来像这样(注意界面的意见):

 public class SomePresenter { /** * Views bound to this presenter must implement this interface */ interface SomeView { void doSomething1(); void doSomething2(); } public void bindView(SomeView someView) { // view binding logic } // more presenter's methods } 

LSP指出实现SomeView任何类都可以与SomePresenter一起使用。 演示者不应该关心传递给它的SomeView的实现是Activity还是Fragment ,或者也许只是模拟unit testing。

所以,对于你的问题的完整答案是:只要主持人不依赖视图的特定实现,而只依赖于他们的超类,一个主持人可以被重复使用不同的视图。

附加信息:

我想你会问你的问题,因为一方面,你觉得单个演示者应该能够使用不同的视图(只考虑不同UI的A / Btesting),但另一方面,事实上,观点是ActivityFragment让你感到不舒服的这个想法。

我个人的意见是,在MVC / MVP中, ActivityFragment都不应该是意见。 在这篇文章中总结了这个说法背后的原因: 为什么Android中的活动不是UI元素 。

在这里输入图像说明

我还build议你看一下在Android中实现MVP的不同方法 – 如果你使用这个,你会发现主持人应该能够使用不同的视图,而且你不会有这种“感觉不对劲”的感觉。

你的活动/片段应该有一个主持人。 我喜欢将所有活动都从BaseActivity扩展,然后,我使这个BaseActivity需要一个Presenter,请参阅此示例:

  public abstract class BaseActivity<Presenter extends BasePresenter> extends AppCompatActivity { protected Presenter mPresenter; @NonNull protected abstract Presenter createPresenter(@NonNull final Context context); @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = createPresenter(this); mPresenter.onCreate(savedInstanceState); } } // other lifecycle methods 

然后,创build一个抽象的BasePresenter

 public abstract class BasePresenter { protected BasePresenter() { } @NonNull public static BasePresenter nullPresenter(@NonNull final Context context) { return new BasePresenter() {}; } @CallSuper public void onCreate(@Nullable final Bundle savedInstanceState) { } 

现在,当创build一个活动时,请按照以下步骤操作:

 public class MyActivity extends BaseActivity<MyActivityPresenter>{ @Override MyActivityPresenter createPresenter(@NoNull final Context context){ return new MyActivityPresenter(all, Your, Dependencies, Here); } } 

现在观看这个video ,了解MVP中活动/视图的责任。