杨靖++洪蕾
摘 要:MVP即Model-View-Presenter,是一种界面设计模式。使用MVP设计模式可以帮助我们分离业务逻辑,显示逻辑和用户界面,让我们的程序具有良好的可扩展性、可测试性,保证了系统的整洁性、灵活性。
关键词:MVP Android 设计模式 UI 控制器 模型 视图
中图分类号:F270.7 文献标识码:A 文章编号:1674-098X(2016)12(a)-0097-02
在Android上,业务逻辑和数据存取是紧耦合的,很多缺乏经验的工程师可能会将各种各样的业务逻辑塞进某些组件或者自定义View中,使得这些组件的单个类臃肿不堪,这对程序的更新迭代造成很大的影响,而好的设计模式可以使得各个模块之间相互分离,解决系统的耦合度,提高程序的扩展性。
1 MVP概述
MVP是根据MVC延伸出来的一种使用者界面设计模式,是20世纪90年代,IBM旗下的子公司Taligent在用C/C++开发一个叫CommonPoint的图形界面应用系统的时候提出来的。MVP能够有效降低View的复杂性,避免业务逻辑被塞进View中。MVP模式比之MVC模式而言解除了View与Model之间的耦合,同时又带来了良好的可扩展性、可测试性。
MVP模式可以分离显示层和逻辑层,它们之间通过接口进行通信,降低耦合。理想化的MVP模式可以实现同一份逻辑代码搭配不同的显示界面,其中的面向接口编程使得程序更加具有开放性以及适用性,保证了灵活性。
2 MVP模式剖析
2.1 MVP模式结构
MVP模式中,用户与View交互,View与Presenter通过接口进行通信,Presenter与Model通过接口进行交互,Model功能不光提供数据模型,还有数据的存储与获取业务包含在内,整体设计而言解除了View与Model之间的耦合。
MVP模式可以让UI界面和数据分离,我们的应用至少可以分为3层,这样可以使得我们对这3层进行独立的单元测试。
MVP并不是一个标准化的模式,用户可以根据自己的需求和理解去实现自己的MVP模式设计。
2.2 View模块分析
视图(View)用于显示UI界面及与用户交互使用,通常使用Android中的Activity、Fragment或者自定义View作为View层。
在此建议使用Fragment作为View层,因为Fragment自身的特殊性,Fragment自身可作为View来使用,使得程序有更好的扩展性和灵活性。
因为MVP自身的独特性,View和Presenter之间直接存在着关联,所以可以使用接口来规定二者的通信。
而View自身需要和Presenter进行通信,所以一般View持有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作通过回转交给Presenter实现,最后Presenter调用View逻辑接口将返回结果给View元素。
理想状态下,可以在同一套业务逻辑中完全替换新的View,因为Presenter和View之间都是使用各自的接口对象进行通信。
2.3 Presenter模块分析
控制器(Presenter)也称为交互中间人,作为沟通View和Model之间的桥梁,它从Model层检索数据后,返回給View层,使得View和Model之间没有耦合,也将业务逻辑从View角色上抽离出来。
所以一般情况下,Presenter具体实现类中需要持有View和Model接口对象来进行交互。
2.4 Model模块分析
模型(Model)负责数据的获取和存储,主要角色是提供数据的存取功能。Presenter需要通过Model层存储、获取数据、请求远程数据等,Model层是一个封装了数据库DAO层及网络获取数据的数据仓库。
因为Model层自身的特殊性,负责数据的获取,而有些特殊应用需要缓存数据到本地数据库,所以从远程服务器和本地存储(如:数据库或文件)都可能会存取到,可以在Presenter层中控制数据的来源。
3 MVP模式应用在Android中的实现
3.1 View与Presenter之间的关联及实现
在MVP模式中,View和Presenter之间相互通信,因此可以定义出View和Presenter中的所有通信动作,可以使用接口来限定V和P层的动作,并且V层应该持有P层的对象,可以使用如下代码:
public interface baseView
void setPresenter(T presenter);
void showLoading(String value);
void dismissLoading();
boolean isActive();
}
public interface basePresenter{
void start();
void initData();
void bindDataToView();
}
public interface LoginContract{
interface Viewextends baseView
void setUsername(String userName);
void setPassword(String passWord);
}
interface Presenter extends basePresenter{
void login(String userName,String pass Word);
}
}
可定义View和Presenter的基类中定义基础的动作,并且规定View中必须实现逻辑接口,将View上的操作通过回转交给Presenter实现,最后Presenter调用View逻辑接口将返回结果给View元素,Presenter层中可在具体类的构造方法中加入View参数,从而实现View和Presenter互相通信的目的。
在初始化Presenter后,Presenter类中必须调用View中实现的逻辑接口,将自身传递进去。
3.2 Android中Model层的设计
因为Model层的特殊性,Model可定义为数据仓库,Model可以从远程服务器或者本地保存的数据中读取数据,可以把请求网络接口的操作放在Model中,或者负责第三方SDK交互操作,这一层包含实际的Model类,用于定义当前数据结构。
Presenter层可以通过回调获取Model层的数据,完成Presenter层和Model层间的通信。
4 结语
该文对MVP设计模式的概念及其在Android中的设计使用进行了介绍。可以看出,MVP模式非常容易使用,但需要指出的是,MVP并非一套固定的準则,用户可以根据自己的需求和理解去撰写自己的MVP模式。
MVP纵然有代码耦合度降低、层级清晰等一系列优点,但是大量的View-Model,Model-View的手动同步会造成Presenter比较笨重,维护起来会比较困难,而且View和Presenter之间太过紧密,如果View变更,Presenter也需要变更,增加了代码的复杂度。
最后,我们应该明白,所有的设计模式都只是对程序开发的指导,并不是准则,我们应该根据自己实际开发中的项目经验和实际情况来选择是否使用以及如何使用设计模式,从而编写出更加优良的代码。
参考文献
[1]CameloeAnthony.安卓架构文章合集[EB/OL].http//www.jianshu.com.
[2]何红辉,关爱名.Android源码设计模式解析与实战[M].中国邮电出版社,2015.