我有一个快速的问题.我正在努力(并努力)用MVP设计模式设计我的应用程序.
我可以问,对于每个视图(活动,片段)我应该有一个单独的演示者类吗?
我在网上看到的资源并不多,显然有样本说明了MVP.如果他们有一些人可以共享吗?
PS我也在这个应用程序中使用RecyclerViewAdapter所以任何关于它的指针将不胜感激
提前致谢
虽然陈旧,但这是一个非常有趣的问题.由于现在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应用程序中非常普遍的错误,主要是由于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
或者,也许,只是一个模拟的单元测试.
因此,您的问题的完整答案是:只要演示者不依赖于特定的视图实现,而只依赖于他们的超类,一个演示者可以重复使用不同的视图.
附加信息:
我猜你问了你的问题,因为一方面,你觉得一个主持人应该能够处理不同的观点(只考虑不同用户界面的A/B测试),但另一方面,事实上观点Activity
和Fragment
让你感觉这个想法不舒服.
我个人认为,MVC/MVP既不是Activity
也不Fragment
应该是观点.这篇帖子背后的原因总结在这篇文章中:为什么Android中的活动不是UI元素.
我还建议你看一下在Android中实现MVP的不同方法- 如果你使用这个方法,那么你很明显,演示者应该可以使用不同的视图,你不会有这种"感觉不对劲"的感觉.
Model-View-Controller设计出现在软件设计的早期,最初用于按钮元素之类的东西。您可以使用MVP(与MVC基本相同)来实现模块化的体系结构,从而易于维护,并从逻辑中分离表示形式。
鉴于您的问题,我认为您确实希望每个视图一个类。这将是最常见的方法。
http://antonioleiva.com/mvp-android/给出了MVP的理论概述。