模型视图演示者 - 相同的视图,不同的演示者

Posted

技术标签:

【中文标题】模型视图演示者 - 相同的视图,不同的演示者【英文标题】:Model View Presenter - same view, different presenters 【发布时间】:2015-07-23 02:29:27 【问题描述】:

我正在使用 MVP 构建一个 android 应用,我对这种模式有一个疑问。

假设我有一个屏幕用于创建一个新人。此屏幕将显示一个EditText 用于插入姓名,另一个用于姓氏,一个ImageView 用于显示选择的照片图片等。 这将导致一个View 接口,由Fragment 实现。它将与一个由另一个类实现的Presenter 接口配合。

很好。

现在我有了另一个功能:编辑现有人物的屏幕。 碰巧的是,此功能的View 与创建新人的功能相同。但是,Presenter 不同。它将首先从 db 加载现有人员以使用当前数据预填充视图,并且单击“保存”时对数据库的操作将是更新而不是插入。

所以,我认为这是 MVP 的一个示例其中一个 View 与 Presenter 的不同实现一起工作以实现不同的用例

    您认为这是一个正确的假设,还是您认为不同的功能应该有不同的ViewPresenter 接口?

    另外,如果你有一个共同的View 和不同的Presenters,那么View 的实现会是共同的,还是会导致两个类实现相同的接口?在实践中,我看到了两种选择。

    只有一个Fragment 实现View。根据用户是要创建新用户还是更新现有用户,Fragment 应该接收并使用不同的 Presenter。

    有两个Fragments。每个人都会实例化一个不同的Presenter。使用组合或继承来避免两个片段之间的代码复制。

在这些情况下,您认为怎样做比较好?

谢谢。

【问题讨论】:

我认为你的方法是正确的。 您可以共享相同的View,并且只有一个Fragment 接收不同的Presenter,具体取决于其用途(编辑或创建)。 【参考方案1】:

当您在 Android 上使用 MVP 模式创建类似 CRUD 的应用程序时,您会遇到这种情况。

你可以很容易地只拥有一个视图,只要你在课堂上很好地记录它为两个不同的演示者实现“视图”,那么它“没问题”


我个人建议创建 2 个视图,一个用于“创建”,一个用于“编辑”(它们可能是相同的(目前),但将它们分开可以清楚地表明它们是不同的东西。)

您可以很容易地看到未来的情况(或此模式的另一个实现),您的“创建”和“编辑”视图实际上具有不同的 API。或者稍有不同的视觉提示,例如一个按钮标记为“创建/添加”,另一个按钮标记为“更新”。

我会亲自制作一个视图库/帮助器类,两个视图都从中提取逻辑。这应该可以帮助您减少整体 LoC,即使您制作了 2 个“视图”类。这样做的好处是您可以轻松更改“创建/编辑”视图,而不必担心影响另一个。 (我倾向于认为 2 个视图文件,当创建/编辑之间甚至存在“轻微”差异时,会更容易维护)

【讨论】:

以上是关于模型视图演示者 - 相同的视图,不同的演示者的主要内容,如果未能解决你的问题,请参考以下文章

WinForms 中的模型视图演示者

如何设置PPT中的”演示者视图”

如何设置PPT中的”演示者视图”

什么是模型视图演示器? [关闭]

如何将用户控件(视图)中的逻辑剥离到演示者

应该将演示者(mvP)注入(dagger2)到android中的视图吗?