文章目录
#架构
在我看来,之所以要学习和使用架构,是因为合理的架构可以将项目的各个模块更好的组织起来,实现“高内聚,低耦合”的目标。
高内聚,低耦合:
单一职责的功能封装成模块,在模块内部高度聚合,模块与模块之间不会互相依赖,即低耦合。
#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)]
- View接收指令,把需要进行的操作传给Controller。
- Controller处理完业务,修改Model的数据。
- 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)]
- Controller 改名为 Presenter,是核心部分,来处理业务逻辑。
- 双向通信。
- 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)]
- 将 Presenter 改名为 ViewModel。
- 采用双向绑定(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之间的逻辑交互
不足:
- 通过Presenter持有View层的引用,部分的逻辑转移出来,使得Activity只做UI相关的事。
- Activity会存在大量的接口。
- UI的事件触发对数据的处理,这要编写在Activity中,View和Presenter互相持有引用以及互相回调,不美观。
- 业务复杂时Presenter会臃肿。
##MVVM
- View对应Activity和xml
- Model对应实体模型
- ViewModel负责完成View和Model之间的交互、业务逻辑
特点:
- 这种模式的目标是通过数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
- 数据成为主导因素,驱动UI自动更新,使得业务逻辑处理只关心数据。
直接通过修改ViewModel修改数据不必考虑线程等问题。 - 将View和ViewModel明显分工,提高效率。
- 一个ViewModel可以复用到多个View。
- 便于进行单元测试。
缺点:
由于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