MVP介绍以及优化封装
近期把项目工程给换了一个架构,原来是用的是mvc ,现在转换为MVP模式,略有心得,给大家分享一下。mvp优缺点都比较明显,希望大家都能理解,不要为了用MVP而用MVP。
MVP的优点:代码复用,条理清晰等等。不过在程序元来说MVP最大的优点还是代码解耦,逻辑清晰,至于代码复用,暂时没有感觉很好用,除非是界面和逻辑基本一样的,不然想要复用,其实不太现实。
- MVP的缺点:会多出许多类,增加了项目的复杂程度,而且像某些逻辑及其简单,事件较少的界面,使用MVP实际上反而是累赘,明明用MVC也就几十行代码的事,改成MVP多了好多个类,反而感觉不划算,改需求时又要翻阅好多个类。因此,我建议大家,如果你的某个界面极其简单,其实就不要用MVP了,MVP是逻辑越复杂,优势越明显,逻辑简单时,反而不如MVC好用。下面简单介绍一下mvc 以及mvp
下面来谈谈文章主题,MVP的优化问题,最开始采用网上大家的写法,发现代码的复用性不好,有些逻辑类似的代码,基本上每个presenter 和model都要重新写,于是想到使用Base类的方法,把某些共有的方法抽离以达到代码的复用性,类似于BaseActivity。
举个例子比如网络请求,在MVC中通常是把网络请求封装在BaseActivity中,不过既然是MVP,网络请求自然应该封装在Model里面啦
public abstract class BaseActivityModel implements IPublicModel {//网络连接模式,当一个页面含有多个网络请求时,通过传入不同的模式,选择相应的加载参数 public static final int MODE_ONE=1; public static final int MODE_TWO=2; public static final int MODE_THREE=3; //网络连接工具接口类 protected InternetConnect mConnect; /** * @param mode 请求模式 * @param intent 上个页面传递过来的intent * @param i 请求回调 * @param parameter 请求的一些参数 */ @Override public void requestData (int mode, Intent intent, JsonI i, String... parameter) {HashMap<String, String> map = new HashMap<>(); JsonBean.Payload payload=new JsonBean.Payload(); mConnect.loadParameter(intent,mode,payload,map,parameter);//加载参数,由子类实现 map.put("payload", VolleyConnect.getGson().toJson(payload)); VolleyConnect.getInVolleyConnect().getServiceMsg( map,i);//封装Volley,传入参数以及回调接口 }/** * 设置网络请求 */ @Override public void setMConnect (InternetConnect mConnect) {this.mConnect=mConnect; } }
同样的共有的方法和字段抽象出presenter的基类
public abstract class BaseActivityPresenter<T extends IPublicView, E extends IPublicModel> implements IPublicPresenter {protected T view; protected E model; protected RequestResult mRequestResult; protected Handler mHandler; public BaseActivityPresenter (T view) {this.view = view; Type type = getClass().getGenericSuperclass();//使用反射实例化Model Type trueType = ((ParameterizedType) type).getActualTypeArguments()[1]; try {this.model = ((Class<E>) trueType).newInstance(); } catch (InstantiationException e) {e.printStackTrace(); } catch (IllegalAccessException e) {e.printStackTrace(); }new TimeCount(200, 50, new ITimeCount() {@Override public void isRuning (long millisUntilFinished) {}@Override public void isFinish () {init();//加载子类方法,延时200毫秒加载 }}).start(); }/* 设置网络请求回调 */ public void setRequestResult (RequestResult requestResult) {mRequestResult = requestResult; }/* 获取view的handler,需要传入一个回调接口 */ public void setHandler (IHandler handlerI) {mHandler = view.exposeHandler(handlerI); }@Override public void requestData (final int mode, String... parameter) {view.setLoading(true); model.requestData(mode, view.exposeIntent(), new JsonI() {@Override public void notice (JsonBean bean) { // if (bean.getStatus().equals("0")) { // mRequestResult.requestDataSuccess(mode,bean); // }else{ // mRequestResult.requestDataFail(mode,bean); // } view.setLoading(false); }@Override public void notice (int error) {view.showError(error); }}, parameter); } }
这样我们就可以更加简单方便的使用MVP模式了,下面是使用示例
public class LoginPresenter extends BaseActivityPresenter<ILoginView,LoginModel> implements ILoginPresenter, RequestResult {public LoginPresenter (ILoginView view) {super(view); }@Override public void init () {setRequestResult(this); }@Override public void requestDataSuccess (int mode, JsonBean bean) {}@Override public void requestDataFail (int mode, JsonBean bean) {} }
可以看到,LoginPresenter不再需要去写model字段和网络请求逻辑,通过泛型,可以自动创建model,而网络请求,仅仅需要设置对应的回调就可以哒。
总结,这样做进一步降低了代码耦合,方便以后代码维护,而且整个MVP感觉更加简单。
MVP介绍以及优化封装相关推荐
- (2014年2月7日升级)Ubuntu-14.04-Alpha2-32位简体中文优化封装版
2019独角兽企业重金招聘Python工程师标准>>> (2014年2月7日升级)Ubuntu-14.04-Alpha2-32位简体中文优化封装版 感谢大家对LINUX封装技术的支持 ...
- C/C++指令集介绍以及优化(主要针对SSE优化)
前言:最近在做一些OpenCV的优化相关的东西,发现OpenCV现在的执行效率很高的原因一部分是来自于底层的优化,比如指令集优化,但是一直没找到比较系统性的关于CPU指令集优化的文章或者是书籍,于是自 ...
- MySQL InnoDB索引介绍及优化
转载自 https://segmentfault.com/a/1190000007445807 一.索引概念 索引(index)翻译为一个目录,用于快速定位我们想要找的数据的位置.例如:我们把一个数据 ...
- mysql基本介绍和优化技巧
一. mysql框架和基本介绍 1. 框架图 更详细: 2. 存储引擎 MYISAM与INNODB对比: MYISAM:mysql5.1及以前版本的默认存储引擎.支持全文检索,压缩,表级锁等,但不支持 ...
- android mvp框架基类,Android MVP架构项目搭建封装,基类封装
综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...
- PlayFramework1.2.7介绍及优化打包发布[四]
静态文件的处理及后续的发布 上文我们分析了一下源码,解决了只编译java类的问题,获得了precompiled/java中的所有内容,那么这一节我们需要解决剩下的几块内容: 生成precompiled ...
- 0304 直播报名|向量索引算法介绍与优化
想做向量搜索确又不知道该选择什么索引吗? 怎么样可以又快又准又最不占内存?相信这个问题很多 Milvus 用户都非常想知道. 然而, 在不同的应用场景下该如何选择一种合适的索引并非显而易见,需要在资源 ...
- 服务器开发27:log4c充当服务器跨平台日志库(cmake跨平台编译,配置介绍及代码封装)
文章目录 一.跨平台编译 1)编译准备 (1)expat编译 2)原生linux编译.安装 3)cmake跨平台编译 二.log4c配置笔记 1)与log4cpp\log4cxx的比较 2)log4c ...
- npp夜光数据介绍 viirs_优化的NPP夜光月度数据下载
优化的NPP夜光月度数据下载 NPP 夜光 之前发表了中科院版的全球夜光数据集. 但是不少科研课题还是需要从较前端的产品开始做,因而之后有同事联系我批量拷贝原始数据. 在我们的研究工作中发现原始的数据 ...
最新文章
- if(a==1 a==2 a==3),为true,你敢信???
- bootstrap signin将邮件改成用户名_[源码和文档分享]基于VC++和Oracle数据库的邮件管理系统的设计与实现...
- torch 判断相等
- dma访问主存时_STM32F103单片机(五)——DMA
- [云炬python3玩转机器学习笔记] 3-9Numpy中的arg运算
- 疫情期间用掉了1400亿个!二维码会被人类扫完吗?
- as_hash ruby_Ruby中带有示例的Hash.delete_if方法
- HIVE: hive.error.on.empty.partition
- mysql 生产实践_京东容器化MySQL生产实践
- ASP.NET对验证控件的一些整理(一)
- WebSSH2 界面ssh
- linux latex编译器,在Ubuntu系统中下载安装LaTeX编辑器TeXstudio的方法
- matlab 计算 fdr,基因富集分析(p值,q值和FDR值)
- ActiveMQ集群安装与配置
- PyQt5快速开发与实战 5.2 容器:装载更多的控件
- 用3D可视化技术实现机房应用资产管理-3D机房资产可视化管理系统
- 【尚硅谷HTML5】前端HTML代码笔记
- 西南石油大学计算机考研人数,8所高校报考人数汇总,21考研这是要妥妥突破400万人的节奏?...
- 英语语法最终珍藏版笔记-9非谓语动词
- 【机器学习】发展至今的机器学习到底对我们的就业和社会产生了哪些影响?