gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:59:27 26 4
gpt4 key购买 nike

我有一个简短的问题。我正在尝试(并努力)使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com