MVC、MVP、MVVM的简单理解
文章脑图
文章内容1、MVC、MVP、MVVM关系
- 1979年,Trygve Reenskaug在一篇论文中提出MVC模型,随着组件化思想发展,诞生了我们现在常用的MVC
- 1996年,Trygve Reenskaug又在一篇论文中,他在MVC的基础上,提出了MVP模型
- 2005年,微软的架构师John Gossman推出了MVVM模式
2、MVC
软件由MVC的View、Controller、Model三部分组成
- View(视图):用户界面展示和用户交互(传送指令到Controller)
- Controller(控制器):业务逻辑处理(完成业务逻辑后,要求Model改变状态)
- Model(模型):数据请求和存储以及处理(将新数据发送到View,改变用户界面)
- 而且所有通信都是单向的
但是我们可以根据需求调整MVC实现方式,如下图
示例
优点:
- 耦合性低:模型与控制器和视图相分离,可以很容易改变应用程序的数据层和业务规则
- 重用性高:模型与控制器和视图相分离,最大化的进行代码重用
- 拓展性高:无论想增加模块或修改业务,只需增加或修改相应的MVC,技术含量降低
- 可维护性高:模型与控制器和视图相分离,降低相互影响程度,易于维护
缺点:
- 不适合小型项目:MVC之间关联性强,没有做到独立重用
- 复杂性高:遵循MVC设计会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
- 耦合性高:模型与控制器和视图虽然相分离,但MVC之间关联性太强,阻碍了独立重用
- 损害操作性能:模型操作接口不同,视图可能要多次调用才能获得足够显示数据。对未变化数据进行不必要的频繁访问
3、MVP
软件由MVP的View、Presenter、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来
- View(视图):用户界面展示和用户交互(传送指令到Presenter,展示Presenter需要的相应界面)
- Presenter(表示器):业务逻辑处理,同时也是View和Model的桥梁(中间人)(获取Model数据处理并返回给View,根据数据处理View的展示)
- Model(模型):数据获取和存储以及处理(通过接口将数据返回给Presenter层)
- View与Model不发生联系,都通过Presenter传递
- View非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而Presenter非常厚,所有逻辑都部署在那里
优点:
- 耦合性低:实现了Model和View真正的完全分离,可以修改View而不影响Modle
- 复用性高:实现了Model和View真正的完全分离,最大化的进行代码重用
- 职责明确、层次清晰:只需定义好View与Presenter的接口,即可实现UI与业务逻辑独立开发,可由不同的开发团队分别实现
- 可维护性高:业务逻辑只在Presenter中进行维护,接口请求及缓存策略只在Model中进行维护,遵循了单一职责类的设计原则,提升了代码的可维护性
- 可测试:业务逻辑都集中在Presenter,那么我们就可以脱离用户接口来测试这些业务逻辑(单元测试)
缺点:
- V和P交互频繁:由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁
- Presenter维护困难:Presenter中除了应用逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
- 关联性高:Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
- 额外的代码复杂度及学习成本
4、MVVM
软件由MVP的View、ViewModel、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来,和MVP一样
MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。
【视图模型】MVVM模式的核心,它是连接View和Model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。
MVVM在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View和ViewModel可以互相通信。
优点:
- 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
- 复用性高:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
- 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
- 可测试:界面素来是比较难于测试的,测试可以针对ViewModel来写。
- 一致性:数据源和视图实现了双向绑定,很好的做到了数据的一致性
缺点:
Bug难定位:数据绑定使得Bug很难被调试。你看到界面异常了,有可能是你View的代码有Bug,也可能是Model的代码有问题
开销大:一个大的模块中,Model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存
不利于代码重用:数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个Model,不同模块的Model都不同,那就不能简单重用View了