我有一个简单的问题。我正在努力(并努力)用MVP设计模式设计我的应用程序。
我可以问,对于每个视图(活动,片段),我应该有一个单独的演示者类吗?
我在网上看到的资源并不多,显然有样本说明了MVP。如果他们有一些人可以分享吗?
PS我也在这个应用程序中使用RecyclerViewAdapter所以任何关于它的指针都将受到赞赏
提前致谢
答案 0 :(得分:17)
虽然陈旧,但这是一个非常有趣的问题。从现在开始,MVP / MVC / MVVM就是一种“热门词汇”。在Android社区中,这个问题值得一个更完整的答案(恕我直言)。
简答:
单个演示者可以与多个视图一起使用
答案很长:
一般来说,没有一个单一的MVP / MVC定义 - 有很多方法可以实现这些架构模式。你没有提供"你的"的定义。 MVP,因此我只能猜到你的想法。
也就是说,有一些"最佳实践"在面向对象编程中,任何架构模式的任何实现都应该(理想情况下)加以考虑。
您问的是,您是否可以重复使用具有不同视图的一个演示者实现,对吧?让我们通过SOLID原则的棱镜来看待这个问题。
" L"代表Liskov替代原则(LSP)。这是SOLID中最容易被误解的原则之一,但该原则背后的一般理念如下:
LSP:如果一段代码与A类对象一起工作,它也应该 与A的任何子类的对象无缝地工作(即子类必须 可以在任何地方使用而不是A
Android中的LSP违规示例为Context
:Context
的子类(例如Application
和Activity
)不等效。某些需要Context
的代码可以与Application
无缝协作,但如果您通过Activity
,则会发生内存泄漏(这是Android应用程序中非常普遍的错误,主要由谷歌的开发者违反了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
,还是仅仅是单元测试的模拟。
因此,您的问题的完整答案是:只要演示者不依赖于特定的视图实现,而只能依赖于他们的超级类,一个演示者可以重复使用不同的视图。
其他信息:
我猜你问了你的问题,因为一方面,你觉得一个主持人应该能够使用不同的视图(只考虑不同UI的A / B测试),但是,另一方面事实上,观点为Activity
和Fragment
让您对这种想法感到不安。
我个人认为,在MVC / MVP中,Activity
和Fragment
都不应该是视图。这篇帖子背后的原因总结在这篇文章中:Why Activities in Android are not UI Elements。
我还建议您查看一下implementation of MVP in Android的不同方法 - 如果您使用此方法,那么您可以明白主持人应该能够使用不同的视图,你不会有这样的感觉,感觉不对劲......
答案 1 :(得分:5)
模型 - 视图 - 控制器设计在软件设计中很早就出现了,最初用于按钮元素。您使用MVP(基本上与MVC相同)以实现模块化且易于维护的体系结构,将表示与逻辑分开。
鉴于你的问题,我认为你确实想要每个视图一个类。这将是最常见的方法。
http://antonioleiva.com/mvp-android/给出了MVP的理论概述。
答案 2 :(得分:1)
您的活动/片段应该有1个演示者。 我喜欢让我的所有活动都从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
然后,创建一个抽象的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) {
}
现在,在创建活动时,请执行以下操作:
public class MyActivity extends BaseActivity<MyActivityPresenter>{
@Override
MyActivityPresenter createPresenter(@NoNull final Context context){
return new MyActivityPresenter(all, Your, Dependencies, Here);
}
}
现在观看this video并了解MVP中活动/视图的责任。