android - MVP Android - 有多少演示者?

标签 android mvp

我有一个简短的问题。我正在尝试(并努力)使用 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 的子类(例如 ApplicationActivity)是不等价。一些需要 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 的实现是 ActivityFragment,或者,也许,只是一个单元测试的模拟.

因此,您的问题的完整答案是:一个演示者可以在不同的 View 中重复使用,只要演示者不依赖于 View 的特定实现,而只依赖于它们的父类(super class)。

附加信息:

我猜你问这个问题是因为,一方面,你觉得一个演示者应该能够处理不同的 View (想想不同 UI 的 A/B 测试),但另一方面另一方面, View 是 ActivityFragment 这一事实让您对这种想法感到不舒服。

我个人的看法是,在 MVC/MVP 中,ActivityFragment 都不应该是 View 。这篇文章总结了这一说法背后的原因:Why Activities in Android are not UI Elements .

enter image description here

我还建议您看一下 implementation of MVP in Android 的不同方法- 如果你使用这个,你就会明白演示者应该能够处理不同的 View ,并且你不会有这种“感觉不对劲”的感觉。

关于android - MVP Android - 有多少演示者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226550/

相关文章:

java - 如何设置密码必须包含至少八个字符、至少一个数字、小写字母和特殊字符?

android - 在自己的网站上托管 .apk 文件

php - 使用 PHP 的简单 MVP 示例

java - MVP设计模式最佳实践

android - 未找到样式属性 'app:attr/cornerRadius'

java - 将第二个 Fragment 添加到 ActionBarActivity 时出现 "Duplicate id, tag null, or parent id 0x0 with another fragment"

android Intent 不适用于wifi、声音、蓝牙?

android - Android 的 MVP,我们应该如何提供带有参数的 fragment ?

java - "No inject registered for a class"即使我声明了它

java - Dagger2 将交互器注入(inject)我的 Presenter