MVP

作者: 嗯哼_e683 | 来源:发表于2020-05-29 08:38 被阅读0次

开发的时候一般都会使用一些架构,好处就是代码逻辑清晰,将第模块之间的耦合,方便测试,维护;

常见的的架构:MVC、MVP、MVVM

MVC

MVC框架模式最早由Trygve Reenskaug 于1978年在Smalltalk-80系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型Model-View-Control。 可能由于MVP、MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM。因为后两种都是基于MVC发展而来的。

1、MVC设计图

image.png

2、MVC三层之间的关系

箭头→代表的是一种事件流向,并不一定要持有对方,比如上图中model→view的事件流向,view可以通过注册监听器的形式得到model发来的事件。在设计中model view controller之间如果要通讯,尽量设计成不直接持有,这样方便复用。也符合mvc的设计初衷

在android中三者对应的关系如下:
视图层(View)

对应于xml布局文件和java代码动态view部分


image.png

控制层(Controller)

MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。

模型层(Model)

针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。

由于android中有个god object的存在activity,再加上android中xml布局的功能性太弱,所以activity承担了绝大部分的工作。所以在android中mvc更像是这种形式:

image.png

因为activity扮演了controller和view的工作,所以controller和view不太好彻底解耦,但是在一定程度上我们还是可以解耦的。

3、MVC总结

我们这里根据sample来总结下:

  • 具有一定的分层,model彻底解耦,controller和view并没有解耦

  • 层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有

  • controller和view在android中无法做到彻底分离,但在代码逻辑层面一定要分清

  • 业务逻辑被放置在model层,能够更好的复用和修改增加业务

MVP

1、MVP说明

MVP跟MVC很相像,文章开头列出了很多种MVC的设计图,所以根据MVC的发展来看,我们把MVP当成MVC来看也不为过,因为MVP也是三层,唯一的差别是Model和View之间不进行通讯,都是通过Presenter完成。

前面介绍MVC的时候提到了算是致命缺点吧,在android中由于activity(god object)的存在,Controller和View很难做到完全解耦。但在MVP中就可以很好的解决这个问题

看下MVP的设计图:

image.png

当将架构改为MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:

View 对应于Activity,负责View的绘制以及与用户交互
Model 处理数据和实体模型
Presenter 负责完成View于Model间的交互,主要的业务逻辑、

` #分割线代码部分

  • Activity对应的View接口
public interface View {
    void onSuccess(List<SqlBean> sqlBeans);     //网络请求成功的方法
    void fail(String str);      //失败的方法
}
  • Activity
public class ShowActivity extends AppCompatActivity implements View {  //实现这个接口的两个方法
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        persenter = new Persenter(this);    //presenter的对象
        initView();
        persenter.load();    //调用网络请求加载数据
    }
@Override
    public void onSuccess(List<SqlBean> sqlBeans2) {  //成功请求数据放入列表集合中刷新适配器
        sqlBeans.addAll(sqlBeans2);    
        rvAdapter.notifyDataSetChanged();
    }

    @Override
    public void fail(String str) {  //失败吐司错误信息
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }
}
  • Presenter层的claaback接口
public interface Callback{
    void onSuccess(List<SqlBean> sqlBeans);     //网络请求成功的方法
    void fail(String str);      //失败的方法
}
  • Presenter层
public class Persenter implements Callback{
    private View view;
    private Model model;

    public Persenter(View view) {  //在activity中创建这个对象是传入的this就是activity类的实现的view
        this.view = view;
        this.model = new Model();
    }
   
    public void load() { //presenter对象调用此方法
        model.load(this);  //调用model的数据请求方法 传入callback的接口
    }

    //Callback接口的成功方法
   @Override
    public void onSuccess(List<NetBean.DataBean.DatasBean> datasBeans2) {
        view.onSuccess(datasBeans2); //把成功的数据给view设置
    }
    //Callback接口的失败方法
    @Override
    public void fail(String str) {
         view.fail(str);  //把失败的数据给view设置
    }


  • model层
public class Model {
    public void load(final CallBack callBack) {
        Retrofit build = new Retrofit.Builder()
                .baseUrl(ApiSerivce.NET_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        ApiSerivce apiSerivce = build.create(ApiSerivce.class);
        Call<NetBean> netBeanCall = apiSerivce.getnetBean();
        netBeanCall.enqueue(new Callback<NetBean>() {
            @Override
            public void onResponse(Call<NetBean> call, Response<NetBean> response) {
                if (response != null){
                    List<NetBean.DataBean.DatasBean> datas = response.body().getData().getDatas();
                    Log.i("TAG", "onResponse: "+datas.toString());
                    callBack.setSuccess(datas);  //成功的话把数据设置给Callback接口
                } else {
                    Log.i("TAG", "onResponse: 空");
                }

            }

            @Override
            public void onFailure(Call<NetBean> call, Throwable t) {
                callBack.setFail(t.getMessage());    //失败的错误信息
            }
        });
    }

    
}

相关文章

  • Android MVP

    Android MVP初探 Android MVP进阶 Android MVP高级 Android MVP扩展

  • MVP / RxJava / Retrofit / RxBus

    MVP Android MVP 详解(上) Android MVP 详解(下) Android中的MVP模式,带实...

  • 一套完整的Android通用框架

    转自吴小龙同学的博客 MVP模式 MVP简介 Android MVP Sample,MVP+Retrofit+Rx...

  • MVP简单尝试

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

  • MVP基础架构

    MVP 是什么 基础架构 登录例子 MVP的优缺点 一、MVP 是什么 MVP全名是 Model - View -...

  • android 安卓 mvp mvvm - mvp

    android 安卓 mvp mvvm - mvpandroid 安卓 mvp mvvm - mvvm MVP M...

  • MVP架构

    目录 1)MVP简介2)MVP实例 1)MVP简介 MVP模式将Activity中的业务逻辑全部剥离出来,Acti...

  • MVC和MVP

    Android mvp 架构的自述 如何更高效的使用MVP以及官方MVP架构解析 老的MVC架构 新的MVP架构 ...

  • MVP系列-Android平台-第1讲-初探MVP

    MVP系列-Android平台-第1讲-初探MVP 内容一:什么是MVP?什么是MVC? 第一点:什么是MVP? ...

  • MVP框架学习

    一、MVP介绍 二、为什么使用MVP模式 三、MVP与MVC的异同 四、使用MVP实现Android的登录的Dem...

网友评论

      本文标题:MVP

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