MVX = > MVC/MVP/MVVM
本文讲会介绍MVC,MVP,MVVM的区别和使用
MVC
MVC模式最早是由Trygve Reenskaug在1978年提出的,是 帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk 发明的一种软件架构。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观
MVC模式
对于mvc模式很多程序员都清楚,但大部分的程序员都不知道的是MVC的概念其实不止一种,就算现在流行的mvvm,mvp也是由mvc变种而来。
早期MVC
- 早期的mvc模式可以简单的理解为:
- Model:根据用户的心理模型构建数据和数据的逻辑
- View:负责呈现,将数据展现给用户
- Controller:负责处理用户的指令,并且反馈给 Model和View
- 流程图:
标准MVC
怎么才算是标准的MVC,我现在还得不出结论。但是目前得到的资料都统一认同的一点就是。MVC分为 View、Controller、Model 三部分,而且这些组成的职责叙述也相同。
- 标准MVC的理解:
- Model: 管理应用的行为和数据,响应数据请求(经常来自视图)和更新状态的指令(经常来自控制器)
- View: 管理作为位图展示到屏幕上的图形和文字输出;
- 翻译用户的输入并依照用户的输入操作模型和视图;
- 流程图:
IOS下的MVC模式
iOS 的 Cocoa Touch 框架一直采用MVC的设计模式,又因为IOS的页面是基于UIViewController 显示的,每个UIViewController下绑定一个根View。这使得控制层和UI层紧密的耦合在一起,这也是致使UIViewController一直很臃肿的原因之一
MVC核心
- MVC最重要的是将原本杂乱的代码层级化,将原本杂乱的代码分为 展示层(View,Controller)和领域层(Model),在这时,领域层中的领域对象由于其自身特点不需要对展示层有任何了解,可以同时为不同的展示层工作。
MVP模式
根据维基百科中描述的MVP模式其实也是MVC的一个变种,其实MVP与MVC也是比较相像,其中最大的区别就是MVP使用Presenter对View和Model进行了解耦合。View与Model不直接通讯都是必须经过Presenter作为桥梁
- mvp理解:
- Presenter: 包含UI的处理逻辑 负责与View和model通讯
- Model: 数据和数据的处理逻辑,只能与Persenter通讯
- View:负责呈现只能与Persenter通讯
- 图解:
- 特点:
- 降低View与Model的耦合,使代码更灵活。
- 但是同时的增加了Presenter 的压力使的为之厚重了许多。
MVP变种:被动视图(Passive View)
被动视图顾名思义就是视图层完全处于被动,即:改模式下View自身不具备改变自身的任何方法,只负责展示视图的结构和内容,本身不具有任何的逻辑。所有的变化都是由Presenter改变。
- 图解
- 特点:
- 视图层完全处于被动,就是说视图成与Model层完全隔离,使得Model层与View层更加灵活,可以自由组合
- 相当于 MVP的进化版,冲而加重Presenter 的逻辑复杂性。
MVVM
MVVM是马丁·福勒的PM(Presentation Model)设计模式的变体。 MVVM以相同的方式抽象出视图的状态和行为, 但PM以不依赖于特定用户界面平台的方式抽象出视图(创建了视图模型)。
MVVM和PM都来自MVC模式。
MVVM组成
- View
- 展现UI
- Model
- 数据模型
- ViewModel
MVVM前身PM(Presentation Model )
PM 模式将视图中的全部状态和行为放到一个单独的展示模型中,协调领域对象(模型)并且为视图层提供一个接口。
在监督控制器中,视图层与模型层中的一些简单属性进行绑定,在模型属性变化时直接更新视图,而 PM 通过引入展示模型将模型层中的数据与复杂的业务逻辑封装成属性与简单的数据同时暴露给视图,让视图和展示模型中的属性进行同步。
总结
无论哪种设计模式都有各自的优点,选择上还是根据自身的平台和项目的需求选择哪种设计模式。只要注意代码的臃肿和各模块之间的耦合性,写出整洁易懂的代码即可。
参考
该文章是学习MVVM过程中顺便记录下的,本人表述能力比较低,有错误之处请指出谢谢。