安卓设计模式演变之经典三层模型(MVC/MVP/MVVM)

转载请标明出处!

先看代码demo再回看文章效果最佳!

目录

一 mvc

1.1 概述

1.2 作用流程

1.3 现状

1.4致命弱点/缺点:

1.5 代码Demo

二   mvp

2.1 概述

2.2 作用流程

2.3 优点

2.4 代码Demo

三   mvvm

3.1 概述

3.2 操作步骤

3.3 注意点

3.4 缺点

3.4 代码demo


一 mvc

1.1 概述

         

1.2 作用流程

       从view开始,接收到用户的操作,从而交给Controller(Activity),在其处理完它的逻辑后,得到结果同步到Model,再去刷新UI界面。

1.3 现状

      Controller(Activity)既要执行View层的职能,又要执行Model层职能,违反了面向对象设计原则之一:单一职责原则。

1.4致命弱点/缺点:

      与model和view最关联的activity,它是否能干净地销毁是评估内存泄露最关键的点。

      MVC中,activity作为C,对View和Model中间的交互非常多,导致它很容易出现内存泄露。

1.5 代码Demo

      网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVC


二   mvp

2.1 概述

          

2.2 作用流程

  • Activity作为View层,接收用户操作后交给Presenter处理;
  • Presenter可能自己处理(Google Sample),也可能交给Model处理(现实中常用);
  • 最后Presenter收到通知(网络请求结束/异步结束...),再由Presenter去刷新View;

2.3 优点

  • 解耦View和Model:如上第三图,修改业务逻辑 找Presenter层;修改页面找View层;
  • 所有的逻辑交互(V和M的交互)放在Presenter层;
  • 分层较为严谨;

2.4 代码Demo

      网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVP_02


三   mvvm

3.1 概述

mvvm或者mvc/mvp是设计思想,DataBinding是一个工具。

m: Model   

v:View   

vm:ViewModel

Model中数据的改变会直接影响到View中的展示,反之一样;这个时候ViewModel主要针对业务逻辑,不可缺失;

View层和ViewModel层粘合度较高,因为它通过ViewModel获取Model层数据(这是MVVM的思想,DataBinding不存在这个问题);

3.2 操作步骤

1 在android工程的build.gradle中添加依赖

// 添加DataBinding依赖
    dataBinding{
        enabled = true
    }

2 建立一个简单的model(javabean);

3 在布局文件中,最外层用<layout标签包裹起来,并在开头配置data->variable信息;

4 具体填充显示的内容需要用到data->variable->name标识.成员属性

3.3 注意点

1 在activity中必须先ReBuilder,然后再书写代码绑定;

2  切记:javabean中被观察的属性必须是public修饰符,因为是DataBinding的规范;

3 不要既用mvp有用mvvm,没人这样写,不要去这么写;

4 再次强调mvvm是业务思想,DadaBinding是实现思想的重要工具,我们可以把业务写在vm中;

3.4 缺点

内存消耗非常大!

3.4 代码demo

      demo中有几个注意的地方:

     1 双向绑定:mvvm中数据和视图的双向绑定。正向:View层接收到用户的输入,改变Model层的javabean属性;逆向:View层接收到用户的输入,改变Model层的javabean属性;如下:

public TextWatcher pwdInputListener = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // View层接收到用户的输入,改变Model层的javabean属性
            userInfo.pwd.set(String.valueOf(s));
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

    public View.OnClickListener loginClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 模拟网络请求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // Model层属性的变更,改变View层的显示
                     userInfo.name.set("Lucas");

                    //这边可以写业务逻辑

                }
            }).start();
        }
    };

2 在实际项目中,具体的业务逻辑可以写在vm中,如上代码注释中所示。

网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVVM

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许进进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值