1.MVC定义(总结自Head First设计模式)
MVC架构像一块夹心饼干,视图和模型是上下的饼干层;控制器是中间的奶油层,负责黏连视图和模型。
MVC架构的目的是实现UI模块、数据模块、业务逻辑模块的解耦,在MVC架构内部利用了其它的设计模式。模型利用“观察者”让控制器和视图可以随最新的状态改变而更新;视图和控制器实现了“策略模式”,控制器是视图的行为,如果希望有不同的行为,可以直接换一个控制器;视图内部使用组合模式来管理窗口、按钮以及其它显示组件。
根据Head First设计模式里提供的一个DJ的例子,笔者画出的UML图如下
从UML图中可以看出,Controller持有View和Model的引用以便直接与它们通信;View持有Controller的引用以便把对View的操作转到Controller中,View持有Model的引用以便直接从Model中直接取得数据;Model通过观察者模式把数据变化通知到View。
在PC上的java程序中,在启动一个mvc模块时,首先实例化Controller,在Controller中实例化View。
2.理解了MVC的定义,再来理解MVP和MVVM的定义就比较简单了,下面看一下MVP的定义。
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。View与Presenter以及Model与Presenter之间都是双向通信,但是View与Model之间不再直接通信。Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。
3.MVVM的定义
MVVM 模式将 Presenter 改名为 ViewModel。MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现自动的双向交互,这就使得视图和控制层之间的耦合程度进一步降低。
在Android代码编写中,一般默认的代码结构是在xml文件中描述布局,定义一个类描述数据结构,在Activity中负责View的展示和交互事件、以及控制逻辑。有人把这种结构定义为MVC;从严格角度来讲,这种android默认的代码结构不是MVC,因为View与Controller没有完全解耦,也可以这么说Android给开发者提供的开发框架是不带任何模式的。
由于现在Android开发中使用Fragment比较多,Fragment里面即可以负责UI逻辑也可以包括控制逻辑。根据笔者的开发经验,对于大多数功能不是很复杂的模块,直接使用Android默认的开完框架就可以,每个Activity或Fragment代码也不是很多(不超过500行),这种实现方式的好处是接口少,实现简单。对于一些功能复杂的模块,建议使用MVX架构,以方便代码的阅读和维护。