4

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

结构:

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

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

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

为此,我设置了一些东西

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

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

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

4

1 回答 1

7

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

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

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

逻辑 1

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

逻辑 2

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

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

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

希望有帮助。

于 2017-05-09T17:44:30.217 回答