JavaScript之MV*模式

前言

在前端技术的快速发展过程中,MVC(模型-视图-控制器)、MVP(模型-视图-表示器)和MVVM(模型-视图-视图模型)也得到了很多使用。然而,这三种框架模式非常相似,不易分清,易于混淆。本文重在讲述它们的概念和应用场景及它们之间的细微差别,使我们更好的理解和使用这三种框架模式。

1.MVC

MVC全名是Model View Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。它强制将业务数据(Model)与用户界面(View)隔离,使用控制器(Controller)来管理逻辑和用户输入。其模式图为:

MVC框架模式其三个部分的含义为:

  • Model:负责在数据库中存取数据,是应用程序中用于处理应用程序数据逻辑的部分。Model不涉及用户界面,也不涉及表示层,而是负责提供应用程序需要的特殊格式的数据。
  • View:描绘的是Model的当前状态,用来显示数据,是应用程序中处理数据显示的部分。View是Model的可视化表示,表示当前状态的筛选视图。用户可以与View交互,包括读取和编辑Model,而更新Model的工作实际由Controller完成。
  • Controller:通常控制器负责从View读取数据,控制用户输入,并向Model发送数据,是应用程序中处理用户交互的部分。Controller是Model和View之间的中介,当用户操作View时,它通常负责更新Model。

MVC的优势

  • 整体维护更容易。数据中心是否改变,什么时候需要更新应用程序这点很清楚。
  • 解耦Model和View,意味着它能够更直接地编写业务逻辑的单元测试。
  • 在整个程序应用中,减少了底层Model和Controller代码的重复,更加高效,易于维护。
  • 由于表示和逻辑的分离,更加易于分工协作,可以让负责核心逻辑的开发人员和负责用户界面的开发人员同时工作。

2.MVP

MVP(模型-视图-表示器)是MVC框架模式的一种衍生模式,专注于改进表示逻辑。MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。在MVP中,当Model变化时,监控Model和更新View,Presenter将Model有效地绑定至View。其模式图为:

MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用!

MVP最常用于企业级应用中,因为这类项目需要尽可能多地重用表示逻辑。具有非常复杂的View和大量用户交互的应用程序可能发现MVC并不能完全符合要求,因为这需要更多的控制器。在MVP中,这些复杂的逻辑可言封装在一个表示器中,可以极大的简化维护工作。

MVP的优势:

  • 模型与视图完全分离,我们可以修改视图而不影响模型。
  • 可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部。
  • 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
  • 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

3.MVVM

MVVM(模型-视图-视图模型)是一种基于MVC和MVP的架构模式,它试图更清晰地将用户界面开发从应用程序的业务逻辑与行为中分离。MVVM的全称为Model-View-ViewModel,其中可以将ViewModel看成一个专门的Controller,充当数据转换器,它将Model信息转变成View信息,还将命令从View传递到Model。为此,很多这种模式的实现都要利用声明式数据绑定来实现将View工作从其他层分离。其模式图为:

View与ViewModel:View与ViewModel之间经过数据绑定和事件进行通信,ViewModel不只暴露Model属性,还会访问其他方法和验证类的特性。View处理自己的用户界面事件,必要时将它们映射到ViewModel。Model和ViewModel上的属性通过双向数据绑定进行同步和更新。数据触发器也可以使我们进一步地对Model属性的状态变化做出反应。

ViewModel与Model:ViewModel似乎完全负责MVVM中的Model,ViewModel可以为了数据绑定而暴露Model或Model属性,也可以包含接口,用于获取和操作在View中暴露的属性。

MVVM优势:

  • 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • MVVM使View抽象化,让很多view重用这段视图逻辑,减少代码背后所需的业务逻辑。
  • 独立开发,使得UI和为UI提供驱动的行为模块的并行开发变得更容易。
  • ViewModel在单元测试中的使用比在事件驱动代码中的使用更加容易。
  • 不需要考虑UI自动化和交互就可以测试ViewModel。

缺点:

  • MVVM不适合简单UI项目。
  • 数据绑定是声明式的,虽然使用方便,但比命令式代码更难调试,在命令式代码中,我们打断点就好了。
  • 大型应用程序中的数据绑定将会产生大量的标记。
  • 在较大型应用程序中,预先设计大量的ViewModel可能更加困难。

总结

MVP和MVVM都是MVC衍生出来的,它们之间的不同在于每一层对其他层的依赖,以及它们是如何紧密相互绑定的。

  • 在MVC中,View了解Controller,Controller了解Model,View也可以直接访问Model。由于View直接访问Model,缺少一定的控制,可能会带来安全性和性能成本,这由程序的复杂性决定。MVVM试图解决这方面的问题。
  • 在MVP中,Controller被Presenter所替代。Presenter位于View和Model之间,监听二者事件,协调它们之间的行动。与MVVM不同,MVP没有将View绑定至ViewModel的机制,这就需要依赖每个View来实现用于让Presenter与View进行交互的接口。
  • 在MVVM中,Model可以特定于View,可以包含状态和逻辑信息,无需向View暴露整个Model。与MVP中的Presenter不同,引用View时不需要ViewModel。View可以绑定到ViewModel上的属性,而属性将Model包含的数据提供给View展示。View的抽象减少了背后所需的代码逻辑。然而,View与ViewModel之间需要进行解释,会有性能消耗。

MVC、MVP、MVVM这三种框架模式在不同的业务上有不同的适用性,只要能满足业务需要就行。

时间: 2024-08-03 21:31:33

JavaScript之MV*模式的相关文章

切图崽的自我修养-[MVVM] Js MV*模式浅谈

前言 做客户端开发.前端开发对MVC.MVP.MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式.网上很多文章关于这方面的讨论比较杂乱,各种MV模式之间的区别分不清,甚至有些描述都是错误的.本文追根溯源,从最经典的Smalltalk-80 MVC模式开始逐步还原图形界面之下最真实的MV模式. GUI程序所面临的问题 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(a

JavaScript高级---门面模式设计

门面模式 两个作用: 1.简化类的接口 2.消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友.它几乎是所有javascript库的核心原则 门面模式的目的是为了让开发人员用更简单的方法调用一些相对复杂或组合的方法,主要就是简化开发的复杂性,提供一个相对容易的API去调用内部的方法供外界去使用,这样程序员开发会变得轻松些,编写一次组合代码后可以反复的去使用它,有助于节省时间和精力 注意: 不要滥用门面模式,所以使用你心仪的门面之前一定要三思而定,搞不好你就会小题大做 引入概念

JavaScript高级---组合模式设计

一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生产对象,实现解耦. 桥接模式 : (桥接模式是一种既能把两个对象连接在一起,又能避免二者间的强耦合的方法.通过“桥”把彼此联系起来,同时又允许他们各自独立变化) 主要作用:主要作用表现为将抽象与其实现隔离开来,以便二者独立化. 组合模式 : (组合模式是一种专门为创建Web上的动态用户界面而量身制定

JavaScript高级---工厂模式设计

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <ti

Javascript备忘模式

使用备忘模式,利用了函数的自定义属性,先看一个例子 var test = function (){} test.myAttr = "attr"; 这样,就给test加上了一个自定义的属性,myAttr. 备忘模式,正式利用了这个方法,将已经运行过的结果存储起来,将函数接受到的参数作为key,将函数运行的结果作为value返回即可.代码如下 var myFunc = function (param) { if(!myFunc.cache[param]){ var result = {};

MV*模式的个人理解

MV*模式主要解决的问题就是 View代码难以维护的问题. MV*模式将View中的逻辑分离出去,形成一个弱逻辑的易于维护的视图. MV*中的*是Model和View的桥梁,负责保持Model和View的同步. MVC模式 Model,View,Controler,Controler负责视图逻辑,数据流向为 View -> Controler,Controler -> Model,Model -> View,三种呈环形结构 MVC缺陷 MVP模式 Model,View,Presenter

javascript 简单工厂模式

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 var Bicycle = new Interface("Bicycle",[

JavaScript中介者模式

JavaScript中介者模式 中介者模式是迎合迪米特法则的一种实现.迪米特法则也叫最少知识原则,是指一个对象应该尽可能少地了解另一个对象.如果对象间的耦合性太高,一个对象发生改变后,难免会影响到其他的对象.在中介者模式里,对象间几乎不知道彼此的存在,它们只能通过中介者对象来互相影响.因此,中介者模式使各个对象得以解耦,以中介者和对象之间的一对多的关系取代了对象间的多对多的网状关系.各个对象只需关注自身功能的实现,对象之间的交互关系就交给中介者对象来实现和维护.      下面是一段使用中介者模

JavaScript的原型模式

原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象. http://www.cnblogs.com/TomXu/archive/2012/04/16/2436460.html http://www.cnblogs.com/silymer/archive/2012/11/02/2751803.html JS原型对象:所有实例都会共享它里面的属性和方法 原型(prototype),是 JavaScript 特有的一个概念,通过使用原型,JavaScrip