我有一个简短的问题。我正在尝试(并努力)使用 MVP 设计模式设计我的应用程序。
我可以问一下,对于每个 View ( Activity 、 fragment )我应该有一个单独的演示者类吗?
我在网上看到的资源不多,可以通过示例清楚地说明 MVP。谁有的话可以分享一下吗?
PS 我也在这个应用程序中使用 RecyclerViewAdapter,所以任何关于这方面的指示都将不胜感激
提前致谢
最佳答案
虽然很老,但这是一个非常有趣的问题。由于如今 MVP/MVC/MVVM 是 Android 社区中的一种“流行语”,这个问题应该得到更完整的答案(恕我直言)。
简答:
单个演示者可用于多个 View
长答案:
一般来说,MVP/MVC 没有单一的定义——有许多方法可以实现这些架构模式。您没有提供“您的”MVP 的定义,因此我只能猜测您的想法。
也就是说,在面向对象编程中有一些“最佳实践”,任何架构模式的任何实现都应该(理想情况下)考虑。
你问的是你是否可以在不同的 View 中重用一个 presenter 实现,对吗?让我们通过SOLID的棱镜来看这个问题。原则。
“L”代表里氏替换原则 (LSP)。它是 SOLID 中最容易被误解的原则之一,但该原则背后的一般思想如下:
LSP: if a piece of code works with object of class A, it should also work seamlessly with objects of any subclass of A (i.e. subclasses must be usable instead of A everywhere)
Android 中违反 LSP 的示例是 Context
:Context
的子类(例如 Application
和 Activity
)是不等价。一些需要 Context
的代码可以与 Application
无缝地工作,但是如果你通过 Activity
代替,就会发生内存泄漏(这是非常普遍的错误在 Android 应用程序中,这主要是由于 Google 开发人员违反了 LSP)。
返回顶部您的问题。我假设您的演示者看起来像这样(注意 View 的界面):
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
,或者,也许,只是一个单元测试的模拟.
因此,您的问题的完整答案是:一个演示者可以在不同的 View 中重复使用,只要演示者不依赖于 View 的特定实现,而只依赖于它们的父类(super class)。
附加信息:
我猜你问这个问题是因为,一方面,你觉得一个演示者应该能够处理不同的 View (想想不同 UI 的 A/B 测试),但另一方面另一方面, View 是 Activity
和 Fragment
这一事实让您对这种想法感到不舒服。
我个人的看法是,在 MVC/MVP 中,Activity
和 Fragment
都不应该是 View 。这篇文章总结了这一说法背后的原因:Why Activities in Android are not UI Elements .
我还建议您看一下 implementation of MVP in Android 的不同方法- 如果你使用这个,你就会明白演示者应该能够处理不同的 View ,并且你不会有这种“感觉不对劲”的感觉。
关于android - MVP Android - 有多少演示者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226550/