近期把项目工程给换了一个架构,原来是用的是mvc ,现在转换为MVP模式,略有心得,给大家分享一下。mvp优缺点都比较明显,希望大家都能理解,不要为了用MVP而用MVP。

MVP的优点:代码复用,条理清晰等等。不过在程序元来说MVP最大的优点还是代码解耦,逻辑清晰,至于代码复用,暂时没有感觉很好用,除非是界面和逻辑基本一样的,不然想要复用,其实不太现实。

  1. 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介绍以及优化封装相关推荐

  1. (2014年2月7日升级)Ubuntu-14.04-Alpha2-32位简体中文优化封装版

    2019独角兽企业重金招聘Python工程师标准>>> (2014年2月7日升级)Ubuntu-14.04-Alpha2-32位简体中文优化封装版 感谢大家对LINUX封装技术的支持 ...

  2. C/C++指令集介绍以及优化(主要针对SSE优化)

    前言:最近在做一些OpenCV的优化相关的东西,发现OpenCV现在的执行效率很高的原因一部分是来自于底层的优化,比如指令集优化,但是一直没找到比较系统性的关于CPU指令集优化的文章或者是书籍,于是自 ...

  3. MySQL InnoDB索引介绍及优化

    转载自 https://segmentfault.com/a/1190000007445807 一.索引概念 索引(index)翻译为一个目录,用于快速定位我们想要找的数据的位置.例如:我们把一个数据 ...

  4. mysql基本介绍和优化技巧

    一. mysql框架和基本介绍 1. 框架图 更详细: 2. 存储引擎 MYISAM与INNODB对比: MYISAM:mysql5.1及以前版本的默认存储引擎.支持全文检索,压缩,表级锁等,但不支持 ...

  5. android mvp框架基类,Android MVP架构项目搭建封装,基类封装

    综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...

  6. PlayFramework1.2.7介绍及优化打包发布[四]

    静态文件的处理及后续的发布 上文我们分析了一下源码,解决了只编译java类的问题,获得了precompiled/java中的所有内容,那么这一节我们需要解决剩下的几块内容: 生成precompiled ...

  7. 0304 直播报名|向量索引算法介绍与优化

    想做向量搜索确又不知道该选择什么索引吗? 怎么样可以又快又准又最不占内存?相信这个问题很多 Milvus 用户都非常想知道. 然而, 在不同的应用场景下该如何选择一种合适的索引并非显而易见,需要在资源 ...

  8. 服务器开发27:log4c充当服务器跨平台日志库(cmake跨平台编译,配置介绍及代码封装)

    文章目录 一.跨平台编译 1)编译准备 (1)expat编译 2)原生linux编译.安装 3)cmake跨平台编译 二.log4c配置笔记 1)与log4cpp\log4cxx的比较 2)log4c ...

  9. npp夜光数据介绍 viirs_优化的NPP夜光月度数据下载

    优化的NPP夜光月度数据下载 NPP 夜光 之前发表了中科院版的全球夜光数据集. 但是不少科研课题还是需要从较前端的产品开始做,因而之后有同事联系我批量拷贝原始数据. 在我们的研究工作中发现原始的数据 ...

最新文章

  1. if(a==1 a==2 a==3),为true,你敢信???
  2. bootstrap signin将邮件改成用户名_[源码和文档分享]基于VC++和Oracle数据库的邮件管理系统的设计与实现...
  3. torch 判断相等
  4. dma访问主存时_STM32F103单片机(五)——DMA
  5. [云炬python3玩转机器学习笔记] 3-9Numpy中的arg运算
  6. 疫情期间用掉了1400亿个!二维码会被人类扫完吗?
  7. as_hash ruby_Ruby中带有示例的Hash.delete_if方法
  8. HIVE: hive.error.on.empty.partition
  9. mysql 生产实践_京东容器化MySQL生产实践
  10. ASP.NET对验证控件的一些整理(一)
  11. WebSSH2 界面ssh
  12. linux latex编译器,在Ubuntu系统中下载安装LaTeX编辑器TeXstudio的方法
  13. matlab 计算 fdr,基因富集分析(p值,q值和FDR值)
  14. ActiveMQ集群安装与配置
  15. PyQt5快速开发与实战 5.2 容器:装载更多的控件
  16. 用3D可视化技术实现机房应用资产管理-3D机房资产可视化管理系统
  17. 【尚硅谷HTML5】前端HTML代码笔记
  18. 西南石油大学计算机考研人数,8所高校报考人数汇总,21考研这是要妥妥突破400万人的节奏?...
  19. 英语语法最终珍藏版笔记-9非谓语动词
  20. 【机器学习】发展至今的机器学习到底对我们的就业和社会产生了哪些影响?

热门文章

  1. 驱动进化之路:总线设备驱动模型
  2. which和whereis
  3. 边框回归的损失函数_一文搞懂常用的七种损失函数
  4. android 之Fragment(轻量级的Activity)详解
  5. Flutter快速入门 五步搞定Flutter环境配置
  6. 一行代码求两个数的最大公约数
  7. 集成学习(一)—预备知识:分类树和回归树
  8. pytorch处理多维输入的问题
  9. max函数的平滑(log-sum-exp trick)
  10. matplotlib 笔记:使用TeX标记