MVP的个人理解

2018-12-10  本文已影响0人  眼睛红红红

                 关于MVP的几点随手感想

             最近在项目中用kotlin重新翻版,纠结用什么结构,最后想来想去还是讲MVP再次用上来了,网上很多很多MVP的例子,但是要想熟练的使用,我建议是自己按照官方的Todo-MVP来自己实践下,因为自己在写的过程中会产生很多很多MVP的“衍生版”,今天我就来谈谈自己的“衍生版”。  

            在写之前,我们还是先老生常谈下,什么是MVP,为什么要使用它,首先,MVP其实是一个MVC的一个“加强版” ,我刚接触Android的时候,很喜欢MVC,因为不考虑其他的,什么都往一个篮子里面放,一个activity可以写2000行,写完以后,成就感十足,能高兴几天,但是,一个篮子的鸡蛋始终不安全,终于,项目要迭代,需求更改,我懵逼了,什么,我写了这么多叫我去改?我到哪里去改?于是加班,加班,终于改完了,之前的成就感所剩无几,于是看到了一篇MVP的文章,我想,这不就能解决我的问题吗?我研究了几天,还真的不错。那么什么是MVP呢?

            我个人觉得MVP实际上就是model  (用来请求数据)-Presenter(处理请求数据在界面上显示)-View(数据显示在界面上),那么这三者是什么关系呢?别急,我打个简单的比方,你去酒店吃饭,你坐下来,便有服务员过来你要吃什么,你说我要吃满汉全席,那么这个时候服务员会记下来你的菜单,然后通知后厨,诶,大厨,来个满汉全席,片刻,大厨将满汉全席做好了,服务员将满汉全席送到你面前,你开始大快朵颐,那么这个过程中,由三个很重要的角色来共同完成----大厨----服务员----你   ,大厨做菜的,就是一个事件的产生者,服务员,就是你和大厨之间的联系者,你要吃什么由服务员转告大厨,大厨做好了再由服务员传给你,你就是这个事件最终拥有者,那这样就很清楚了,大厨就是model-请求数据的 ,服务员--presenter--处理数据与界面的之间的交互显示,你--View--界面显示数据。那我们为什么要选择MVP呢,如果你用MVC,有天请求改了,界面也改了,你得在activity里面洗澡了,因为你所有的过程都是由一个角色来承担,而MVP就是将角色明确化,界面改了,我就改V层,请求改了我就改M层,是不是独立化了?

            好在这里我们先说下常用MVP的结构,这是我习惯的结构,contract--连接三者,Model--请求数据的,P层前面讲了,我们看看里面的内容

首先我们看看contract里面做了什么操作,

 可以看到这是一个接口,里面包含了两个接口和一个抽象类,这就是mvp的三个重要角色,那么为什么要这样定义能,首先可以看到,View,里面有两个待实现的方法,,一个刷新,一个加载,model里面就一个请求的方法,presenter里面两个对应View中一个处理刷新,一个处理加载。,那接下来看看实现他们的类和他们的子类。

            首先看看presenterIml

这是一个完整的P层,那么这个mVIew是哪里来的呢?我们回到contract里面去,是否看到P层的抽象类继承了一个BasePresenter?我们看看里面做了什么,

后面继承的BasePresenter我们不管,我们可以不用这个,首先这个类的作用就是来持有V的对象,我们不用再去实例化V,而且还是用的是弱引用,避免了因持有activity的对象而造成了内存泄露,好,回到P层去,我们实现了P层接口的两个方法,这两个方法带了两个请求参数,我们在使用前分别赋值了,而且,mview的赋值我们是在调用请求之前做的,因为接口请求,我们需要将数据显示在界面上,我们看requestData这个方法,实际上就是通过model请求数据,然后将数据显示到view上,可以看到,根据状态的不同,我们选择刷新,还是加载,加载和刷新全部放到P层来控制,这样V层只负责显示就行,你要什么数据跟我说,我找model去要,拿到了就给你,这就是三者之间的一个反馈性过程。但是,大家看到了一个很奇怪的东西,这个mvpListenner到底是干嘛的呢?其实,这里我做了一个小技巧,接口通常的作用是作为回调数据的,我没有直接用model在这里请求数据,而是model请求数据通过这个接口来回调的。看看这个接口

再来看看modelIml,

是不是清楚了很多呢?实际上model请求成功后,将数据传递给了这个接口,然后P层中通过这个接口再获取到m层的数据,这样的目的是分离化,不知道大家注意到了一点没有,我在View层的接口中传入了一个泛型T,为什么这样做呢,其实目的是为了复用,如果传递一个具体的类型,那么我需要些很多歌View的接口来满足需求,我传进来一个泛型,那么想要什么类型我传进来,然后在编译期去确定具体的数据类型,那么我一个View的接口就能满足所有的需求,这样更简化了代码。

        那这个例子只是我个人的一个理解,实际开发中这种模式很多地方都能用到,其实MVVP模式也是大概这种思想,viewmodel类似于p层要做的事情,下次有机会将MVVP模式也做一番解释。

上一篇下一篇

猜你喜欢

热点阅读