专注于Java领域优质技术号,欢迎关注
作者:饮杯梦回酒
MVCMVC全名为Model View Controller ,是模型(Model)- 视图(View)- 控制器(Controller)的缩写。
MVC优点:
MVC缺点:
MVP全名为Model View Presenter ,是由MVC演变而来,它和MVC的相同之处在于:Controller / Presente都是负责业务逻辑,Model管理数据,View负责显示。不过在MVP中View并不直接与Model交互,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,即使用 Presenter 对视图和模型进行了解耦,让它们彼此都对对方一无所知,沟通都通过 Presenter 进行。
MVP特点:
MVP优点:
MVP缺点:
MVVM全名为Model View ViewModel ,早在 2004 年,Martin Fowler 发表了一篇名为 Presentation Model (以下简称为 PM 模式)的文章,PM 模式与 MVP 比较相似,它从视图层中分离了行为和状态;PM 模式中创建了一个视图的抽象,叫做 Presentation Model,而视图也成为了这个模型的『渲染』结果。MVVM 与 Martin Fowler 所说的 PM 模式其实是完全相同的,Fowler 提出的 PM 模式是一种与平台无关的创建视图抽象的方法,而 Gossman 的 MVVM 是专门用于 WPF 框架来简化用户界面的创建的模式;我们可以认为 MVVM 是在 WPF 平台上对于 PM 模式的实现。
WPF(Windows Presentation Foundation – 微软推出的基于Windows 的用户界面框架)
标准MVVM
作为 Martin Fowler 在 2004 年提出的概念,Presentation Model 到今天其实也是非常先进的,PM 模式将视图中的全部状态和行为放到一个单独的展示模型中,协调领域对象(模型)并且为视图层提供一个接口。在监督控制器(Controller)中,视图层与模型层中的一些简单属性进行绑定,在模型属性变化时直接更新视图(耦合),而 PM 通过引入展示模型将模型层中的数据与复杂的业务逻辑封装成属性与简单的数据同时暴露给视图,让视图和展示模型中的属性进行同步。这样看起来好像与MVP差别不大,但两者最大的区别就在于视图和展示模型之间状态的同步,即数据双向绑定。这里通过Vue中的一个小例子就能明白:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="../vue.js"></script> <script type="text/javascript" src="../jquery-3.3.1.min.js"></script></head><body> <div id="app"> <input type="text" v-model="inputValue"> <button v-on:click="handleClickon">点击提交</button> <ul> <li v-for="item in list">{{item}}</li> </ul> </div> <script> var app = new Vue({ el: '#app', data: { list: [], inputValue: '' }, methods: { handleClickon: function() { this.list.push(this.inputValue); this.inputValue = ''; } } }) </script></body></html>可以看到当我们在控制台(可以看成VM)处理数据时,可以立即更新到视图上(V),而在视图上输入时(V),也可以在控制台同步看到(VM),这就是双向数据绑定,也是MVVM与MVP的区别之处。
MVVM优点:
MVVM模式和MVC模式类似,主要目的是分离视图(View)和模型(Model),有几大优点:
总结:
从 MVC 架构模式到 MVVM,从分离展示层到展示模型层,经过几十年的发展和演变,MVC 架构模式出现了各种各样的变种,并在不同的平台上有着自己的实现。
在架构模式的选用时,我们往往没有太多的发言权,主要因为平台本身往往对应用层有着自己的设计,我们在开发客户端或者前端应用时,只需要遵循平台固有的设计就可以完成应用的开发;不过,在有些时候,由于工程变得庞大、业务逻辑变得异常复杂,我们也可以考虑在原有的架构之上实现一个新的架构以满足工程上的需要。
各种架构模式的作用就是分离关注,将属于不同模块的功能分散到合适的位置中,同时尽量降低各个模块的相互依赖并且减少需要联系的胶水代码。文中对于 MVC、MVP 和 MVVM 架构模式的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎提出不同的意见进行讨论。