架构模式
- 架构模式是使用多种设计模式,来改进代码的组织方式,实现软件设计的低耦合高内聚(降低模块间的接口的复杂度,每个模块尽可能独立完成自己的功能,不依赖于模块外部代码)
- 前后端不分的时代,前端代码由后端生成发送到浏览器(服务端渲染),所以最先是后端采用MVC或MVP架构模式,前端只是后端的View层
- Ajax技术的诞生,使前端可以独立获取数据,不再依赖于服务端渲染
- 前端代码也需要保存数据、处理数据、生成视图,所以导致前端MVC、MVP以及MVVM的诞生
MVC架构模式
- 如图实线代表方法调用,虚线代表事件通知
- Model层:
用来封装数据以及处理数据的一些方法,一旦数据发生变化便通知相关视图
Model与View之间使用了观察者模式,View注册监听Model,更新View - View层:
用来做数据的展示
View与Controller之间使用策略模式,View通过controller实例,实现特定的响应策略 -
Controller层:
是模型与视图间的纽带,将响应机制封装到Controller中 - 具体实现
//Model层 function Model(){ //模拟数据 var val = 0; //定义一个操作数据的方法跟一个返回数据的方法 this.add = function(){ val +=1; } this.getVal = function(){ return val; } //观察者模式 var views = [] //将观察者存入数组 this.regist = function(view){ views.push(view); } //通知view更新 this.notify = functiong(){ //所有定义了render方法的view都会执行render方法 for(var i = 0;i < views.length;i++){ if(views[i].render){ views[i].render(this); } } } } //View层 function View(controller){ //获取节点 var $num = $('#num'); var $add = $('#add'); this.render = function(model){ $num.text(model.getVal()); } $add.on('click',controller.add) } //Controller层 function Controller(){ var model = null; var view = null; this.init = function(){ model = new Model(); view = new View(this); model.regist(view); } this.add = function(){ model.add(); model.notify(); } } //运行程序时,以Controller为入口 (function(){ var controller = new Controller(); controller.init(); })()
- MVC中view跟controller是一一对应的,视图与控制器联系过于紧密,不能多个View复用一个controller,因为初始化入口在controller
- 上面很明显可以看出model是直接可以通知view更新
MVP架构模式
- MVP是MVC模式的改良
- Model层:
依然用来封装数据以及处理数据的一些方法
View的更新不依赖于model,Model只负责管理数据
Model更新完数据后将结果交给Persenter -
View层:
依然用来做数据的展示
View与Presenter之间使用观察者模式与策略模式
View通过Presenter实例,实现特定的响应策略通知Model更新
等Model更新完之后Presenter调用view暴露给回调函数通知View更新 -
Presenter层:
Presenter是模型与视图的中间人,除了处理逻辑外,还有大量的数据同步操作
具体实现
//Model层 function Model(){ //模拟数据 var val = 0; //定义一个操作数据的方法跟一个返回数据的方法 this.add = function(){ val +=1; } this.getVal = function(){ return val; } } //View层 function View(){ //获取节点 var $num = $('#num'); var $add = $('#add'); this.render = function(model){ $num.text(model.getVal()); } this.init = function(){ var presenter = new Presenter(this) $add.on('click',presenter.add) } } //Presenter function Presenter(view){ var _model = new Model(); var _view = view; _view.render(_model); this.add=function(){ _model.add(); _view.render(_model); } } //运行时以View为入口 (function(){ var view = new View(); view.init(); })()
MVVM架构模式
- MVVM将数据的同步自动化,以前的Presenter不需要手动进行数据同步,而是交给框架提供的数据绑定进行同步,只需要告诉他View显示的数据对应Model中的那一部分即可
- Model层:
它只关注数据本身,没有任何数据处理行为,可以认为就是Json转化的Js对象,数据处理交给VM - View层:
通过模板语法将数据渲染进DOM,通过数据绑定与Model进行数据同步 -
ViewModel层:
除了实现业务逻辑外,最主要的是实现数据绑定,之前Presenter中的手动数据同步交给ViewModel中的数据绑定来做 -
双向数据绑定:
实现View与Model的同步自动化,不同的MVVM框架中实现数据绑定的方式有所不同,主要有以下两种
数据劫持+观察者模式(Vue)
脏值检查(Angular)
具体实现参考Angular与Vue的相关文章
如需转载,请注明出处: http://www.aaronxue.top/2017/06/架构模式.html
相关推荐
-
快速全面了解 React 新功能: Suspense 和 Hooks 框架
2018-12-23
-
minipack源码解析以及扩展 框架
2019-5-3
-
React 组件通信 框架
2019-9-15
-
node.js对mysql数据库封装库node-transform-mysql库 链式调用、使用简单、文档完善 框架
2019-3-18
-
必懂的webpack高级配置 框架
2019-8-18
-
React中富文本编辑器的技术选型调研 框架
2018-12-13
-
用Vue.js和Webpack开发Web在线钢琴 框架
2019-3-10
-
Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native) 框架
2019-2-20
-
Ant Design Upload 组件上传文件到云服务器 – 七牛云、腾讯云和阿里云的分别实现 框架
2019-8-15
-
深度剖析Vue中父给子、子给父、兄弟之间传值! 框架
2019-9-13