【模式】の基础——MVC、MVP、MVVM架构以及DataBinding

本文详细介绍了MVC、MVP、MVVM等主流软件架构的特点及应用,对比了它们在不同场景下的优劣,并针对Android平台进行了深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


#架构
在我看来,之所以要学习和使用架构,是因为合理的架构可以将项目的各个模块更好的组织起来,实现“高内聚,低耦合”的目标。

高内聚,低耦合:
单一职责的功能封装成模块,在模块内部高度聚合,模块与模块之间不会互相依赖,即低耦合。

#MVC架构

  • Model:模型 ——>数据
  • View:视图 ——> 界面
  • Controller:控制器 ——>业务
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7o3ftm3m-1657790697725)(https://img-blog.youkuaiyun.com/20170307205629910?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTgxNTk0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
  1. View接收指令,把需要进行的操作传给Controller。
  2. Controller处理完业务,修改Model的数据。
  3. Model数据变更,反映给View更新视图。

P.S.用户可能与View交互,也可能直接操作Controller
#MVP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfGrxPX1-1657790697727)(https://img-blog.youkuaiyun.com/20170307205908397?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTgxNTk0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

  1. Controller 改名为 Presenter,是核心部分,来处理业务逻辑。
  2. 双向通信。
  3. View 与 Model 不发生联系,都通过 Presenter 传递。

#MVVM
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gpBUC9W-1657790697727)(https://img-blog.youkuaiyun.com/20170307210331622?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTgxNTk0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

  1. 将 Presenter 改名为 ViewModel。
  2. 采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。
    #MVC与三层架构
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3lDM8Qiv-1657790697728)(https://img-blog.youkuaiyun.com/20170307211211461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTgxNTk0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
    三层架构是软件领域普遍使用的分层式架构,MVC可以说是它的一种实现,其中Controller和View都属于表示层,Model属于业务层。

#Android的架构
##MVC

  • View对应xml布局文件
  • Model对应实体模型
  • Controller对应Activity处理数据和UI

但是因为xml作为View却承担的责任太少,导致Activity既要负责业务逻辑又要负责视图,所以比较复杂,代码量大。
##MVP

  • View对应Activity和xml,负责View的绘制和UI交互
  • Model对应实体模型
  • Presenter负责完成View和Model之间的逻辑交互

不足:

  1. 通过Presenter持有View层的引用,部分的逻辑转移出来,使得Activity只做UI相关的事。
  2. Activity会存在大量的接口。
  3. UI的事件触发对数据的处理,这要编写在Activity中,View和Presenter互相持有引用以及互相回调,不美观。
  4. 业务复杂时Presenter会臃肿。

##MVVM

  • View对应Activity和xml
  • Model对应实体模型
  • ViewModel负责完成View和Model之间的交互、业务逻辑

特点:

  1. 这种模式的目标是通过数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
  2. 数据成为主导因素,驱动UI自动更新,使得业务逻辑处理只关心数据。
    直接通过修改ViewModel修改数据不必考虑线程等问题。
  3. 将View和ViewModel明显分工,提高效率。
  4. 一个ViewModel可以复用到多个View。
  5. 便于进行单元测试。

缺点:
由于DataBinding数据绑定使 定位问题变难了。你看到界面展示有问题了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。

#MVVM技术涉及到的DataBinding
##DataBinding中的三种类型数据
DataBinding中有三种不同的数据,object、field、collection。

###ObseravbleObjects
Observable是提供添加移除监听的一个java接口,DataBinding基于此
接口提供了一个基础类BaseObserable,我们可以这样使用它,通过Bindale注解绑定一个getter,当data属性发生改变在setter中发出通知,这样就实现了响应。

###ObseravbleField
ObseravbleCollection:google为我们提供了一些Obserable类: ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong,
ObservableFloat, ObservableDouble, and ObservableParcelable

###ObseravbleCollection
集合类:ObservableArrayMap、ObservableArrayList、

##Binding
Android Studio会根据layout文件自动生成一个默认的Binding类,类名是根据layout文件名生成的,并有"Binding"后缀结束。例如:activity_main.xml生成的Binding类为ActivityMainBinding。我们可以通过DataBindingUtil类或者**Binding.inflate方法获得binding对象。

在xml中对于绑定事件处理有两种方法:方法引用监听绑定
dataBinding还允许在xml导入类、导入View资源、自定义Binding类名、支持表达式等。

##DataBinding的其他使用
1.位置或者变化的Binding类使用executePendingBindings()
2.通过BindingAdapter注解去自定义个自己的setter
3.在xml属性上使用语法"{@=}",进行双向绑定
4.BindingConversion

具体参考:http://www.jianshu.com/p/ba4982be30f8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值