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());    //失败的错误信息
                }
            });
        }
    
        
    }
    

    相关文章

      网友评论

          本文标题:MVP

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