【问题标题】:Nested MVP on Android: how toAndroid 上的嵌套 MVP:如何
【发布时间】:2017-10-06 14:09:19
【问题描述】:

我正在开发一个由 3 个主要部分组成的 Android 测试项目,每个部分都遵循 MVP 模式。 这些部分相互嵌套,我想知道我所遵循的策略是否正确/最佳

结构:

  • 书籍:包含不同页面的 ViewPager
  • 页面:包含多个项目的自定义线性布局
  • Item:自定义视图(在本例中是一个简单的按钮)

每个部分都使用 MVP 结构(例如,对于 Book,我制作了 BookPresenter、BookView 和 BookModel,Page 和 Item 也是如此)

作为一个用户案例,我想跟踪用户点击按钮的次数,每次将页面背景更改为随机颜色,以及用户达到第 10 次点击的时间告诉 BookPresenter 转到第二页。

为此我设置了一些东西

  • BookView 创建 BookPresenter,它依次创建每个 PageView。
  • 每个 PageView 创建 PagePresenter 依次创建 ItemView(最终创建 ItemPresenter)

在这一切中,BookPresenter 具有对 PagePresenter 的引用,而 PagePresenter 具有对 ItemPresenter 的引用,因此当需要执行某些操作时,它们可以与结构中的子演示者或父演示者进行通信

现在的问题是: 这是建立具有嵌套 MVP 的系统的正确方法吗? 因为如果我想拥有一个 PageView 但不是在 Book 中,我需要将它放在 Newspaper 中(其他类与 Book 的一些替代行为)我仍然需要重新创建与 Presenters 和所有其余部分的整个依赖关系链...

【问题讨论】:

    标签: android architecture mvp decoupling android-mvp


    【解决方案1】:

    “Child-Presenter”如何与其“Parent-Presenter”通信?他们不(直接,不通过 EventBus)

    在我看来,这种父子关系是代码异味,因为它们在父子关系之间引入了直接耦合,这导致代码难以阅读、难以维护,其中不断变化的需求会影响很多组件(因此在大型系统中这几乎是不可能的任务),最后但并非最不重要的一点是引入了难以预测甚至更难以重现和调试的共享状态。

    到目前为止一切顺利,但不知何故,信息必须从 Presenter A 流向 Presenter B:Presenter 如何与另一个 Presenter 通信?他们没有!演示者必须告诉另一个演示者什么?事件 X 发生了吗?演示者不必互相交谈,他们只需观察同一个模型(或者准确地说是业务逻辑的同一部分)。这就是他们从底层获得更改通知的方式。

    每当事件 X 发生(即用户单击视图 1 中的按钮)时,Presenter 都会让该信息下沉到业务逻辑中。由于其他 Presenter 正在观察相同的业务逻辑,因此业务逻辑会通知他们发生了某些变化(模型已更新)。

    来源:http://hannesdorfmann.com/android/mosby3-mvi-4

    因此,让我们将其应用到您的示例中。 你应该有类似Readable 的东西(如果你想对Book implements ReadableNewsPaper implements Readable 进行抽象)。使用Readable.getPageCount(),您可以获得ViewPager 的页数。使用Readable.getCurrentPage(),您将获得当前的Page。然后,您需要某种观察者模式来在页面更改时收到通知。当用户单击 ItemView 中的按钮时,您还需要一个 Listener/Observer 模式。这样的点击将是上图中的事件 X。单击按钮后,您可以让信息通过 Presenter 流向您的业务逻辑,从而更改 Readable 对象。然后,此更改将通知此 Readable 对象的观察者,例如 PagePresenter,然后更新 PageView 以设置页面的背景颜色。

    所以关键是:通过业务逻辑进行通信,而不是一些 View 到 View 或 Presenter 到 Presenter 的通信。

    希望对您有所帮助。

    【讨论】:

    • 如果您的演示者观察业务逻辑,那么演示者中发生了什么?您为 MVP 架构提供了一个案例,但使用了 MVI 的参考图像。
    • Presenter,哪个层包含“业务逻辑”?
    • 业务逻辑在Presenter下面一层。
    猜你喜欢
    • 2018-11-29
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2012-05-21
    • 2018-12-23
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多