您的位置:首页 > 移动开发 > Android开发

Android MVP的一点理解

2016-10-29 21:15 197 查看
最近还好,有点空闲时间来接收一下新东西,毕竟有强大的学习能力才会有立于不败之地发言权嘛,除了吃饭睡觉打篮球之外,别的时间就全来撸代码了…哦,不对…还有一件事,时刻吐槽室友法海禅师..哈哈,不扯淡了..记录下这阵子都干嘛了..

MVP + Retrofit + OKHttp + RxAndroid + Glide + Picasso + cardView + RecycleView + Material Design + ...等等的,安卓现在主流框架基本上来讲就这么多吧..(其实还有很多很好的,只是还没有发现而
已)现在逐个来记录一下自己的理解..

首先,MVP模式..


看见MVP这三个字母我就觉得麦迪时刻来了..哈哈,最有价值球员哈,当然这是相对于NBA来讲..Android中MVC更像NBA中的MVP,其中MVC中的Activity和Fragment就相当于NBA中的MVP吧,因为啥都是我自己来,举个例子就是既当爹也要当妈,而用MVC模式还是比较好的,最起码数据请求的类还是分开的!

而有很多情况下呢,撸代码的时候都是一大坨一大坨的撸,也就是说在一个activity或者Fragment中直接上,你要啥我就给你弄啥,咋了?听说你要数据?你稍等,我这就写,啪啪啪啪,一大坨出来了..啥?听说你要更新UI,你稍等,啪啪啪啪一大坨又出来了..啥?听说你要对各种数据来进行判断,区分与筛选,那您稍等,啪啪啪啪的一大坨又出来了..

艾玛,这有bug了的话,找代码找的人是嘴歪眼斜,吐完再吐,自己写的倒还罢了,别人写的,你来找或者你写的别人找..来啊,互相伤害啊…这是目前的这些模式的一些不足的地方..所以产生了个叫做MVP的东西,

这个东西呢,我喜欢形象一点的,喜欢举例子来理解,MVP举个例子就是,M层就是Model层,男人就是Model层,这层干啥的呢?哈哈,简单,这层就是提供钱的,V层就是View层,这层又是干啥的呢,哈哈,简单,女人就是View层,P层就是presenter,这层呢,哈哈,简单,这层就是媒婆层….为啥举这个例子,,听完我的解释,你会觉得我太有才了..哈哈…男人负责给钱,女人来负责化妆让自己更漂亮,但是呢她俩比较害羞,并不会直接联系,男人不会直接给钱到女人手里,当然作为新时代的独立化女性也不好意思给男人要么,,这时候中间人出现了,就是媒婆.男人把钱给媒婆,媒婆把钱给女人..女人要买iPhoneN会告诉媒婆,媒婆来负责给男人传达意思…这么一理解,简直不要太简单好吧…代码也是人,何必搞得那么官方呢,,俗一点好啊,接地气也更容易理解..下面来个代码试试??

首先来个接口(你妹啊,上来就接口?哈哈,别捉急么,慢慢来,步子大了容易扯到蛋哈)


package text.scc.com.custompulltorefresh.contract;

/**
* Created by scc on 2016/10/29.
*/

/**
* 此接口为一个协议接口,个人觉得主要目的就是避免日后的接口过于多,
* 所以一个接口来对应的三个绑定在一起的人.
*/
public interface Contract {

public interface View{

void show(String msg);  //此方法来显示姑娘要买的东西(比如说iPhoneN) msg是男士给钱成功了.

void noShow(String msg);//此方法来显示姑娘要买的东西(比如说iPhoneN) msg是男士可能在闭关,没钱给,
}

public interface Presenter{

void setShow();     //媒婆这里就一个方法,有钱了我就给那姑娘钱,没钱了我也给你一句话(那男的没钱-.-)

}

public interface Model{

void isHaveMoney(OnIsHaveMoneyListener listener); //男人这里是否有钱可以给那个姑娘

}


上面是一个协议类的三个接口,现在我们来实现。

首先我们先来实现model。

package text.scc.com.custompulltorefresh.model;

import text.scc.com.custompulltorefresh.contract.Contract;

/**
* Created by scc on 2016/10/29
*/

public class ModelImpl implements Contract.Model{

@Override
public void isHaveMoney(OnIsHaveMoneyListener listener) {
/**
* 此处网络请求代码省略,简单模拟一下
*/
//首先假设网络请求成功,那么我们把底下的没有成功注释掉运行一下
listener.haveMoney("我没钱,但是愿意割肾给哪位菇凉买iPhoneN");

//假设网络请求没有成功,那么我们把上面的成功的注释掉运行一下
//        listener.noHaveMoney("我没钱,买不起,你和能买得起的谈恋爱去吧...");
}
}


model中重写了所实现的接口的两个方法,一个成功一个失败,目前呢,我们模拟的是请求成功,那么好..现在数据请求成功了,有钱呢,但是怎么去给媒婆说我有钱了呢,接下来咱们来看怎么告诉给媒婆.也就是presenter的实现类.

package text.scc.com.custompulltorefresh.presenter;

import text.scc.com.custompulltorefresh.contract.Contract;
import text.scc.com.custompulltorefresh.model.ModelImpl;
import text.scc.com.custompulltorefresh.model.OnIsHaveMoneyListener;

/**
* Created by scc on 2016/10/29
*/

public class PresenterImpl implements Contract.Presenter{
//媒婆此处声明了男人与女人的各自的接口
private Contract.Model model;
private Contract.View view;

//媒婆在自己的构造方法中new出了男人的对象,那么女人的对象就不是new出来的啦,是通过构造方法的参数传递进来的
public PresenterImpl(Contract.View view) {
this.view = view;
model = new ModelImpl();
}

//此处重写了接口中的setShow方法,调用model的引用,也就是问男人isHaveMoney你有钱嘛?用接口回调来获得男人是否有钱
@Override
public void setShow() {
model.isHaveMoney(new OnIsHaveMoneyListener() {
//如果有钱,view.show(msg)通知女人,这男的有钱,恩,不错,考虑一下吧...
@Override
public void haveMoney(String msg) {
view.show(msg);
}
//如果没钱,view.noShow(msg)通知女人,这男的没钱,你自己看着办吧,也许是个潜力股呢哈...
@Override
public void noHaveMoney(String msg) {
view.noShow(msg);
}
});
}
}


此类是presenter接口的实现类,也就是全世界唯一嘴上具有PS功能的人物—>媒婆了哈…我们来看看,这媒婆到底称职与否…她获得男人的对象,然后通过参数传递进来女人的对象,然后在setShow方法中把男的问清楚之后,直接就给女人把信息返回回去了..总体来说,这媒婆凑活吧..接下来我们来看看大姑凉都做了啥..

package text.scc.com.custompulltorefresh;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import text.scc.com.custompulltorefresh.contract.Contract;
import text.scc.com.custompulltorefresh.presenter.PresenterImpl;

/**
* Created by scc on 2016/10/29.
*/
public class MVPActivity extends AppCompatActivity implements Contract.View{

private TextView textView;
//声明一下媒婆阿姨的对象
private Contract.Presenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mvp_act);
textView = (TextView) findViewById(R.id.mvp_text);
//此处把媒婆阿姨new出来,把自己传进媒婆的构造中,媒婆哪里就也有了自己的一个分身了..
presenter = new PresenterImpl(this);
//然后问阿姨啥情况,媒婆自己说我有个setShow方法,你自己看吧
presenter.setShow();
}
//然后此处重写了view接口中的两个方法..输出结果,得到男人的答复!!
@Override
public void show(String msg) {
textView.setText(msg);
}

@Override
public void noShow(String msg) {
textView.setText(msg);
}
}


此类也就是Activity或者Fragment等等给用户展现的姑娘.我要展示什么那我不管,,我只要数据,只要结果…怎么来的结果我不管,我只管给presenter要就可以了..

然后呢,我们来看看输出结果.



OK了..

接下来我们在model中注释掉请求成功,来个请求失败,看Activity这位菇凉怎么展示..看看输出结果



到此为止,OK了…

被同事吐槽为我和民工之间只差一顶安全帽,可见我的审美有多么的差,所以呢代码不好看,命名也没有起好,然后MD也用的不熟练,之前都是在自己的QQ空间记录,因为我觉得自己很菜,所以呢不好意思拿出来让大家看,后来呢从开源里面我学习到了很多的东西,大家都是在相互分享,相互学习,没什么拿不出手的,丑就丑吧…只要咱能把思路与逻辑搞明白就好了…本人发表的第一次博客,后续还会有很多很多吧…如果觉得还凑活的话,评论一下也好,点个赞也罢,算是我知道最起码还有人看,哈哈(虽然很丑…)

今天只说了MVP,其余的下次或者下下次慢慢再写吧,每写一篇博客我就要举例子,说实在的,特么的例子也不好找哈,…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvp