我最近开始构建android应用程序,我想从头开始使用设计模式。有人告诉我,MVP(Model-View-Presenter)是Android应用程序的良好模式。
我想知道是否可以实现MVP模式的“被动视图”变体?如果可以的话,我将显示任何代码..但现在我不知道被动视图在android应用程序中应如何显示。另外,在被动视图场景中哪个角色将扮演MainActivity?
对于任何有关如何实现被动视图的解释,教程或示例,我将不胜感激。
答案 0 :(得分:1)
MVP模式建议您的View类(片段,活动)不包含任何表示形式或业务逻辑,但是所有逻辑都委托给Presenter类。当初始化视图,发生事件或破坏视图时,演示者通常会调用由视图提供的void
方法。
因此,设想一个实现以下接口的View和Presenter:
public interface Contract {
interface View {
void initView();
void setTextColor();
}
interface Presenter {
void init();
void onButtonClicked();
}
}
在我们的简单示例中,View将初始化Presenter(依赖注入不在本文的讨论范围之内),然后调用Presenter的initView
方法。演示者将负责所有初始化逻辑,例如从网络/存储中获取数据,并在需要时更新视图。反过来,用户单击按钮时,视图将通过调用Presenter的onButtonClicked()
方法将操作委托给Presenter。演示者可以进行一些处理,根据结果,可以调用View的setTextColor()
方法。
使用MVP的最重要原因是能够使用Junit和诸如Mockito之类的模拟框架来测试您的逻辑。您的Presenter应该使用纯Java或Kotlin编写,并且不依赖于Android框架库。然后,您可以通过使用JVM来测试Presenter,而不必连接设备。这都是Bob叔叔clean architecture guidelines的全部。
答案 1 :(得分:1)
我感觉这里的主持人存在致命的误解。尽管MVP是通用标准,但大多数人都将Presenter视为Controller,甚至更糟的是将Controllers,存储库,网关混合在一起。
演示者应该做一件事:演示。那应该是唯一的目的。许多人在不知不觉中实现了MVC体系结构,称为MVP,并限制了数据流,如下所示:View <-> Controller / Presenter <-> Model ..现在,此模式没有错,因为它分离了系统的各个层,如果操作正确。您应该能够将Domain和Data层(Android Dev通常将这些层称为Presenter和Model层)交换到另一个系统,并且代码仍然可以正常工作而不会出现任何依赖关系问题。为此,您必须避免任何会导致绑定到所谓的详细信息(UI,数据库,框架,硬件,浏览器,操作系统)的依赖关系。现在说到图层,我们通常会具有以下数据流层次结构:UI-> Domain-> Data在Android应用程序中,我们会将所有UI代码放入UI组件中的位置。现在有两个放置演示者的选项:您可以通过为演示者特定视图引入一个接口来抽象视图。避免在演示者中出现任何与Android /硬件相关的特定依赖项(例如Context)。如果达到此目的,那么您可以说Presenter属于您的Domain层。如果您的Presenter知道任何Android详细信息(甚至更糟的是数据库),那么您会自动将其放入View层(如果尝试从中访问数据库,甚至会破坏体系结构)。 现在,假设您对View进行了抽象,并且Presenter是Domain对象。 Presenter不再关心其表示View的实际实现,它具有抽象,并且知道将值传递到何处。无论是移动应用,网络应用还是嵌入式应用,都不再重要。 现在,Presenter如何从数据层接收数据并用数据填充UI?我们使用与View相同的技术:抽象。 我们将创建存储库,网关,DataService的接口/抽象类,或者您想调用数据/模型层的接口。您将拥有POJO,数据访问逻辑,缓存等。请注意,到目前为止,我们正在使用POJO!我们不依赖任何平台绑定细节(如上所述)。但是,由于我们现在需要进行一些缓存,因此我们必须使用Android(或Room)中的SQLite Manager。这该怎么做?抽象。将导致您的代码绑定到任何平台的任何细节进行抽象。
在下面,您可以看到Bob叔叔提出的可靠软件体系结构设计的图片。内层不应该对外层有任何了解。 这张照片反映了我刚才在这里描述的开发技术,与鲍伯叔叔的书中描述的技术相同。通过使用抽象,我们避免了对细节的任何依赖。实际的实现(活动,片段,SQLiteDatabase)通过依赖注入从外部“连接”到内部层。 这种技术也称为依赖反转。
我建议您阅读罗伯特·C·马丁(Robert C. Martin)的书《清洁架构》,以加深对它的理解。
答案 2 :(得分:0)
与MVP合作并不难
首先,在模型包中,您将存储具有设置程序,获取程序和应用程序所有数据结构的所有POJO类
然后是演示者,您可以在其中绑定此对象并对其进行逻辑处理。
将所有逻辑放入演示器后,它将所有这些信息传递给View,因此之后,MainActivity(在本例中为View)将只有几行代码,并且您的代码看起来会真正地井井有条。
对于被动视图,这意味着您拥有的View带有更少的代码,可以在将来运行测试并拥有易于处理的代码。
您可以使用MVC,MVP,MVVM,但是如果要启动,建议您从MVP开始
看看这张MVP图片
您还可以查看THIS有关MVP的教程