Model-View-Presenter(MVP)方案对Android有用吗?


34

如何将Android中的View和Presenter分开,同时将对用户操作(MVP的Presenter部分)的反应设置为与显示GUI元素(MVP的View部分)相同的活动。

“在模型视图演示者中,就像Martin Fowler或Michael Feathers [2]所说的那样,UI的逻辑被分为一个称为presenter的类,该类处理来自用户的所有输入,并告诉“哑”视图何时何地。显示”(从此处引用)。

直到现在,我还认为Android的主要功能之一是智能的 Activity,它可以执行操作,对操作做出反应并显示结果。MVP方案与Android理念矛盾吗?尝试在Android上实现它是否有意义?如果是,该怎么办?


2
+1好问题,因为我还没有在android应用程序源代码中看到过mvp / mvvm。看到mvp android示例以及它们产生多少代码/库开销会很有趣。在Stackoverflow推荐的在Android和其他平台之间生产应用程序可移植的方式上
k3b 2012年

也许我可以将其放入Stackoverflow,还是违反规则?
Gangnus

您可以要求一位管理员迁移此问题,而不是重复“问题”。这里programmers的问题是更具争议性的问题:“您对.. / ...的看法是好还是坏?”,而stackoverflow更像是“ Android中是否有mvp的示例”。对我来说,两个地方都还可以。
2012年

我为自己的不幸感到非常抱歉,但到目前为止,我还没有找到连接管理员的方法:-(
Gangnus 2012年

这个问题适合堆栈溢出。顺便说一句-您可以通过使用“标志”链接标记您的帖子来与主持人联系。
克里斯·

Answers:


15

Android应用程序基本上是基于模型-视图-控制器(MVC)构建的-MVP听起来就像是同一件事,尽管我之前从未听说过该术语。活动扮演着Controller的角色,XML视图就是这样(尽管您可以在Activity中以编程方式构建它们-使用XML进行创建更容易,更简单)以及您自己编写的模型。是的,该模型非常实用。

您可能没有多少听说过这种设计模型的可能原因是Android框架迫使您将视图分开。由于移动设备上的应用程序通常很小,因此人们不会使用完整的MVC。他们倾向于视图和动作层,其中动作层完成了模型的大部分工作(小型)。

如果您正在编写跨平台应用程序,则可能需要研究一种四层方法:视图,操作,业务逻辑和模型。View和Action层将特定于平台,而Business Logic和Model不会更改。基本上,您将演示者和用户交互分为“操作”层,该层调用“业务逻辑”层以执行用户想要的操作。


+1!拜托,您能给它上一些好的文章提供一两个参考吗?
Gangnus 2012年

4
我认为MVP也为您提供了一个保持Action(= Presentation)层平台独立的机会-至少在您的不同平台提供相似的UI功能时。
Doc Brown

@DocBrown从理论上讲,是的。实际上,我不确定这是否会实现,因为用户交互可能会影响视图或演示者。例如,在Android中,滑动由活动处理,但在网页上,视图由浏览器处理。
Michael K

12
“ Android应用程序基本上是基于Model-View-Controller构建的”-很抱歉,在很多级别上都是错误的。Android框架架构是围绕“上帝类”构建的,“上帝类”中的视图/控制器逻辑混乱不堪。
伊戈尔·菲利波夫

2
我希望我可以对@IgorFilippov的评论多于一次。Android应用程序通过设计实现MVC的想法是一个普遍的误解。与iOS相反​​,Android没有采用GUI体系结构,而将关注点明确分离并允许使用隔离的,易于测试的模型。您必须自己提供一个,无论是MVP,MVC还是其他。
Piovezan

6

我没有任何关于Android编程的经验,但是对一些入门性的Android编程教程进行了简短的了解,但我看不出MVP像其他任何事件驱动框架一样不那么有用的原因。该Activity班是不是从很大的不同Dialog或者Form其他框架,所以它应该很容易创建应用程序的任何活动的子类的“Activitity演示”级,并把核心逻辑在那里。

发送到“活动”的事件必须委托给演示者,并且如果演示者要自行发送事件或调用其他与系统相关的功能,则您的活动必须通过与演示者共享的接口提供相关功能。但这与我所知道的任何其他GUI框架基本相同。


+1谢谢您的时间。但是正如您从另一个答案中看到的那样,在Android中使用的是相似但不同的模型。“我用散文讲了50年,对此一无所知!” 现在,我将尝试查看模型的差异。
Gangnus

4
@Gangnus:MVP是MVC的一种特殊形式,在这里codebetter.com/jeremymiller/2007/07/26/…您可以找到更多信息。我很确定这不是“ MVC或MVP”的问题。活动可能是“控制器”的一种形式,但它们取决于平台。将每个活动的UI逻辑分离到独立于平台的演示者类中,可能会使它们更易于单元测试和移植。
Doc Brown

5

MVP对于Android绝对有用。它有助于组织和对代码进行单元测试。最好的部分是,新手阅读您的代码后,他们将能够理解代码,并在知道应该去哪里后立即开始做出贡献。这是一个非常有用的链接,可帮助您了解带有示例的MVP

这是MVP的所有三个组成部分的简要说明

视图

在android MVP中,视图包含两件事情:Activity – android resource View – java interface Activity实现视图,并将其自身注入到Presenter中(View接口),以便演示者可以使用View接口与Activity对话。该图的前三个方框显示了View和Presenter之间的通信。

主持人

Presenter充当View和Data / Model之间的中间层。View(Activity)命令presenter演示某些内容,然后presenter从数据库/模型中获取数据并将数据的可呈现形式返回给View。然后,View负责在屏幕上显示该数据。并请记住,Presenter是一个普通的Java类,它不应包含任何android组件,否则它将使Presenter的单元测试变得困难。

如果希望在演示者中使用数据库,请进行活动,创建一个数据库实例并将其注入演示者中。这将帮助您在单元测试时模拟数据库,并使您能够测试业务逻辑。

模型

MVP中的模型不过是您的数据源。View不会直接与数据对话,而是命令Presenter处理它的数据并返回信息,无需进一步修改即可显示。


1
信息很有用,谢谢,但是它给出的方式很糟糕。您不仅应该引用一个站点,甚至自己引用一个站点,还应该在此处提供信息。不允许参考答案。请改用评论。我不会仅仅因为您网站上的有用信息而对其进行标记。请将其更改为评论或在答案中添加一些可回答问题正文的关键信息。然后,您肯定不仅会得到我的加分,甚至还会得到答案检查。
Gangnus

@Gangnus我已经在答案中提供了必要的信息,因为放置所有内容将使答案非常大。
Ajit Singh

1
MVP实际上有两种。被动视图(您在此处描述的内容)和监督演示者,可将视图直接数据绑定到模型(非常类似于MVVM和许多Web MVC框架)。
RubberDuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.