Android中MVC、MVP和MVVM及实例

本文详细介绍了Android中三种常见的软件架构模式:MVC、MVP和MVVM。分别阐述了它们的组成、工作原理以及在Android应用中的具体实现。在MVVM中,特别强调了双向数据绑定的优势,并提供了简单的实现步骤,以帮助开发者理解如何在实际项目中应用MVVM架构。

三种软件架构的框架(设计的典范)各自有什么特点?有什么区别?

一、MVC

1.组成及作用

  • Model:模型(提供并处理数据)
  • View:视图(渲染界面,数据可视化)
  • Controller:控制器(MV的连接器,负责用户交互,控制程序流程和业务逻辑的处理)

2.工作原理

当用户触发事件的时候,view层发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上

发送指令
通知更新数据
显示
View
Controller
Model

android中对应:
Model(网络请求、JavaBean类)-View(xml文件)-Controller(activity、fragment)

缺点: 中小型项目不适用

  • xml作为view层,控制能力太弱了。此时Activity既是Controller又是View,代码量太多。View和Model耦合度太高,不易于维护。

二、MVP

1.组成及作用

  • Model:模型(提供数据
  • View:视图(数据可视化)
  • Presenter/Controller:控制器、提出者(处理数据、负责用户交互

2.工作原理

当用户触发事件的时候,View通过接口将事件传递给Presenter处理,Presenter处理完再通过接口把数据交给Model。

传递事件
请求&提交数据
View
Presenter
Model

android对应:
Model(JavaBean类)-View(xml文件、activity、fragment)-Presenter/Controller(单独类:逻辑处理几网络请求)

Presenter作为Model和View的桥梁,MV解耦了。
View与Presenter通信是接口实现的,我们的activity,fragment去实现实现定义好的接口,而在对应的Presenter中通过接口调用方法。

优点:

  • View层和Model层完全分离,只负责自己的活。

缺点: 中小型项目不适用

  1. View与Presenter耦合度较高,View变更了,Presenter也要变更。
  2. 逻辑很复杂的页面,你的接口多时维护接口的成本就会非常的大。可以抽取公共逻辑定义成基类。

三、MVVM

ps:AS中有快捷生成方式,需要导入一个jar。

1.工作原理:

重点在于实现了“VM数据模型与View数据通过Binder双向数据绑定”,Model和ViewModel之间的交互是双向的,因此View视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View视图上。

<双向 通过Binder
View
ViewModel
Model

页面数据需要更新时不用再调用setText了。只要string这个变量一更新,Textview就会自动显示更新后的值,这就是数据绑定

android对应:
Model(…)-View(…)-ViewModel(…)

优点:

  1. 低耦合,View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 可测试 ,测试可以针对ViewModel来写。

2.★MVVM实例:

[1] 架构目录:

架构目录

[2] 构建步骤:

0)build gradle (mudule:app)中添加dataBinding

android{
	//dataBinding 数据绑定:model更新后通过databinding直接更新到view,viewModel不需要做操作
    dataBinding{
       enabled true
    }
}

1)创建ViewModel类,成员变量Model,构造传入ViewDataBinder、View。

public class LoginViewModel {
    private ViewDataBinding binding;
    private LoginFragment fragment;
    /*model一定是public,不然xml拿不到*/
    public LoginModel model;

    public LoginViewModel(LoginFragment fragment,ViewDataBinding binding){
        model=new LoginModel("无人的海边","123456");
        this.fragment=fragment;
        this.binding=binding;
    }

2)在layout文件(.xml)中 添加根节点和data,指定对应ViewModelRebuild Project 自动构建DataBinder类。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data class="LoginBinding">
        <variable
            name="loginVModel"
            type="com.ltt.rabbitwarehouse.mvvm.viewmodel.LoginViewModel" />
    </data>
    <LinearLayout...>
        ...
    </LinearLayout>
</layout>

3)在ViewModel 构造中 绑定xml中的ViewModel和View,创建要绑定的方法

public LoginViewModel(LoginFragment fragment,ViewDataBinding binding){
    ...//此处代码上文已有
    //绑定xml中ViewModel和View
    this.binding.setVariable(com.ltt.rabbitwarehouse.BR.loginVModel,this);
}

public void login(View view){
    Toast.makeText(fragment.getContext(),"已登录",Toast.LENGTH_SHORT).show();
}

public void autoInfo(View view){
    //按钮的点击方法,点击改变model值,view会自动更新
    model.setAccount("张三");
}

4)在layout文件(.xml)中 属性绑定 @={属性} 、方法绑定 @{方法}

<LinearLayout>

    <EditText
        android:hint="请输入账号"
        android:text="@={loginVModel.model.account}"/>

    <EditText
        android:hint="请输入密码"
        android:text="@={loginVModel.model.password}"/>

    <Button
        android:text="登录"
        android:onClick="@{loginVModel.login}"/>

    <Button
        android:text="自动填写"
        android:onClick="@{loginVModel.autoInfo}"/>
        
</LinearLayout>

5)在ViewModel中监听属性的变化

//监听模型数据的变化
model.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
    @Override
    public void onPropertyChanged(Observable sender, int propertyId) {
        if(propertyId == com.ltt.rabbitwarehouse.BR.account){
            Toast.makeText(fragment.getContext(),"切换其他账户",Toast.LENGTH_SHORT).show();
        }
    }
});

最终效果:点击自动填写改变model值,通过数据绑定动态改变了view内容

最终效果


参考文档:
https://blog.csdn.net/chaoshenzhaoxichao/article/details/79871145
https://blog.csdn.net/qq_41872247/article/details/102981466
https://blog.csdn.net/victoryzn/article/details/78392128
https://yuzhiqiang.blog.csdn.net/article/details/79082234
https://www.jianshu.com/p/fe30044d2bd2 通俗易懂MVVM!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值