Mvp模式解析

作者: 无辛 | 来源:发表于2016-05-30 18:41 被阅读181次

前言:

MVP模式是从MVVM 模式转化而来,MVVM是Model-View-ViewModel的简写,而MVP则是Model-View-Presenter 模式,其中Model负责网络数据请求及数据格式转换,view负责页面数据的刷新,presenter则为中转站负责两者之间的协调。

下面列举两种的差别:

1、MVC

MVC 模式是model view 和 controller 三者之间可以互相通信,但是这样就存在一个问题,就是view层可以调用model层和controller层的代码,所以会导致逻辑混乱。

2、MVP
MVP 是Model view 和 Presenter 组成,MVP最大的好处就是剥离了Presenter层出来替换掉了Controller,从而使得model 层和view层不能直接进行通信,必须通过presenter层间接进行通信,一般来说一个Activity只有一个presenter层来控制逻辑,但是在复杂的Activity中可以通过绑定多个Presenter来实现复杂的逻辑。

下面为大家展示下我已经封装好的逻辑代码:

model :
<pre>
//basemodel 与数据请求相关的接口

public class BaseModel {

public  interface Classify {      
    void getCookClassify(CallBack<CookClassify> callBack);      
}      

}
//MainModel 实现BaseModel.Classify中的接口进行数据请求
public class MainModel implements BaseModel.Classify {
@Override
public void getCookClassify(CallBack<CookClassify> callBack) {
// 数据请求
GetDataList.getCookClassify(callBack);
}
}
</pre>

view:

<pre>
//baseActivity 源码:

public abstract class BaseActivity<T> extends AppCompatActivity {
//Presenter 实例
protected T presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    beforeOnCreate();
    super.onCreate(savedInstanceState);
    setContentView(getLayoutId());
    initViews();
    initdata();
}

protected abstract int getLayoutId();

protected abstract void initViews();

protected abstract void initdata();

protected  void beforeOnCreate(){

}


@Override
protected void onResume() {
    super.onResume();
    afterOnResume();
}

protected  void afterOnResume(){

}

@Override
protected void onDestroy() {
    super.onDestroy();
    afterOnDestory();
}

protected  void afterOnDestory(){

}

}

//baseview 接口,用来刷新页面数据,可以根据需求添加不同的方法。
public interface BaseView<T> {
//显示加载框
void showDialog();
//加载成功
void onSuccess(T t);
//加载失败
void onError(Throwable t);
//取消加载框
void dismissDialog();
}
</pre>

presenter:

<pre>
public class MainPresenter {
// 页面刷新接口
private BaseView baseView;
// 数据调用model
private BaseModel.Classify cookClassify;

public MainPresenter init(BaseView baseView) {
    this.baseView = baseView;
    this.cookClassify = new MainModel();
    return this;
}

public void getData() {
    baseView.showDialog();
    cookClassify.getCookClassify(new CallBack<CookClassify>() {
        @Override
        public void onCompleted() {
            baseView.dismissDialog();
        }

        @Override
        public void onError(Throwable e) {
            baseView.dismissDialog();
            baseView.onError(e);
        }

        @Override
        public void onNext(CookClassify cookClassify) {
            baseView.onSuccess(cookClassify);
        }
    });
}

}
</pre>

使用步骤:

在BaseModel 中新建model接口 例:
<code>
public interface Classify {
void getCookClassify(CallBack<CookClassify> callBack);
}
</pre>

新建相应的Model实现接口里的方法并进行数据获取 例:
<pre>
public class MainModel implements BaseModel.Classify {
@Override
public void getCookClassify(CallBack<CookClassify> callBack) {
GetDataList.getCookClassify(callBack);
}
}
</pre>

新建presenter 例:
<pre>
public class MainPresenter {
private BaseView baseView;
private BaseModel.Classify cookClassify;

public MainPresenter init(BaseView baseView) {
this.baseView = baseView;
this.cookClassify = new MainModel();
return this;
}

public void getData() {
baseView.showDialog();
cookClassify.getCookClassify(new CallBack<CookClassify>() {
@Override
public void onCompleted() {
baseView.dismissDialog();
}
@Override
public void onError(Throwable e) {
baseView.dismissDialog();
baseView.onError(e);
}
@Override
public void onNext(CookClassify cookClassify) {
baseView.onSuccess(cookClassify);
}
});
}
}
</pre>
继承BaseActivity并传入presenter数据类型 例:
<pre>
public class MainActivity extends BaseActivity<.MainPresenter> implements BaseView<CookClassify> {

@Override
protected void initdata() {
// 实例化presenter
presenter = new MainPresenter().init(this);
presenter.getData();
}

@Override
public void showDialog() {
//todo: 显示dialog
}
@Override
public void onSuccess(CookClassify cookClassify) {
//todo: 刷新页面数据
MyListAdapter adapter = getAdapter();
adapter.refreshDatas(cookClassify.getTngou());
}
@Override
public void onError(Throwable t) {
//todo: 错误处理
Log.d("debug", "onError===>" + t.getLocalizedMessage());
}
@Override
public void dismissDialog() {
//todo: 取消dialog显示
}
}

</pre>

更多详情见github openobj:

github : https://github.com/momentslz

更多内容请添加本人公众号:

相关文章

  • MVP简单尝试

    MVP模式解析 标签: Android 架构 MVP MVP模式的核心思想 MVP将Activity中的U...

  • Mvp模式解析

    前言: MVP模式是从MVVM 模式转化而来,MVVM是Model-View-ViewModel的简写,而MVP则...

  • MVP应用架构模式

    最近通过《Android源码设计模式解析与实战》对MVP应用架构进行了了解,摘其重点记录于此。 MVP简介 MVP...

  • 20190120一周笔记汇总(索引)

    Android Android实战 | 详解MVC、MVP模式并分别实现登录界面案例 良心解析 | 搭建NDK环境...

  • Android架构

    MVP+Retrofit+Rxjava在项目中实战解析 文章目标 MVP在android中的原理解析 MVP+Re...

  • An_MVP模式okhttp_RecyclerView

    运用MVP模式写(okhttp)解析json,数据传输到RecyclerView中;一、三个层Model,view...

  • Android架构师

    MVP架构设计 MVVM架构设计 IOC框架与代理模式 泛型及其JSON解析框架 手写ButterKnife框架 ...

  • MVP篇三,MVP模式在Android上的应用

    1、MVP模式的基本介绍 参见: MVP模式1,MVP模式的原理 http://www.jianshu.com/p...

  • Mvvm开发模式解读

    MVVM 模式与Mvp: Mvvm将Mvp的Presenter 改名为 ViewModel,基本上与 MVP 模式...

  • Android MVP模式

    前言 1. MVP模式 MVP:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,...

网友评论

    本文标题:Mvp模式解析

    本文链接:https://www.haomeiwen.com/subject/wkkcdttx.html