JS常用设计模式(MVC、MVP、MVVM及其他设计模式)

JavaScript016

JS常用设计模式(MVC、MVP、MVVM及其他设计模式),第1张

一、MVC

MVC模式的意思是,软件可以分成三个部分。

视图(View):用户界面。

控制器(Controller):业务逻辑

模型(Model):数据保存

各部分之间的通信方式如下。

View 传送指令到 Controller

Controller 完成业务逻辑后,要求 Model 改变状态

Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

二、互动模式

接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

另一种是直接通过controller接受指令。

三、实例:Backbone

实际项目往往采用更灵活的方式,以 Backbone.js 为例。

1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。

2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。

3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。

四、MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过 Presenter 传递。

3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

五、MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。 Angular 和 Ember 都采用这种模式。

1、js工厂模式

说明:

在函数中定义对象,并定义对象的各种属性,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法。

引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new object()因为后者可能会出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象。

在函数的最后返回该对象。

不推荐使用这种方式创建对象,但应该了解。  

2、js构造函数模式

说明:

与工厂方式相比,使用构造函数方式创建对象无需在函数内部创建对象,而使用this指代,并而函数无需明确return。

同工厂模式一样,虽然属性的值可以为方法,仍建议将该方法定义在函数之外。

同样的,不推荐使用这种方式创建对象,但仍需了解。

3、js原型模式

说明:

函数中不对属性进行定义。

利用prototype属性对属性进行定义。

同样的额,不推荐使用这样的方式创建对象。

4、构造函数+原型的js混合模式(推荐)

说明:

该模式是指混合搭配使用构造函数和原型方式。

将所有的属性,不是方法的定义在函数中(构造函数的方式),将所有属性值为方法的利用prototype在函数之外定义(原型方式)。

推荐使用这样的方式创建对象,这样有好处。

5、构造函数+原型的动态原型模式(推荐)

说明:

动态原型方式可以理解为混合构造函数,原型方式的一个特例。

该模式中,属性为方法的属性直接在函数中进行了定义,但是因为

if(typeof Parent.lev == "undefined"){

          Parent.prototype.lev = function(){

            return this.name

          }

   Parent.lev = true

    } 

从而保证创建该对象的实例时,属性的方法不会被重复的创建。

如果是定长的都是8位的话,这里就可能是一种单向加密的方式,而就是说,只存在从明文向密文进行的一个加密过程,不存在一个由密文向明文的解密过程,这种单向加密又称非可逆性加密,多用于校检式对比.校验显然不须要知道明文就可以了,所以采用的是单向加密,比较代表性的就是MD5,SHA-1等算法.

因为明文一般是4-16位,而加密后的密文只有8位,若是一个双向加密,显然明文长度大于密文长度,这里其实是说,明文的容量大于密文的容量,不管是那种加密算法,都会造成大量的"碰撞"!而一个双向加密算法的好坏,碰撞机率是一个非常重要的因素的!显然,若是只有8位时,只能说是一个不太好的校验方式算法,也就是单向算法的.所谓的碰撞就是指的有两个不同的明文会得到相同的密文,那么这两个明文就发生了碰撞.这个机率越大,则算法的可行性越差!

而若是单向校验,也就是单向加密,这里虽然碰撞机率大,但可以用程序去做一下控制的!比如你输入三次密码如果校验不成功,则将帐户进行封冻等都是较好的手段!而双向加密,别人可以直接进行算法测试,不会依赖于程序,则很容易破解的.这与密码设计的初衷是背离的.

如果是8位定长,也就是说不管你是多少位密码,这极可能是MD5加密或是MD5的前身MD4与MD2加密.也可能是程序设计者自己设计的算法!但绝对是一个单向加密的!

MD5你可能见过16位的和32位或者更多的.其实你看一下其中的具体实现就知道了,他是四组值进行运算的,最终这四组若是b+c(第二组与第三组组合)就是MD5的16位算法.若是a+b+c+d四组全组合时就是32位的算法.但如果系统对于密码强度大小不是很大时,为了省却计算机的运算时间,完全可以只有用其中四组中的一组,也就是所能看到的8位的.这种算法是MD5,但只取的是其中的一组值的.而MD2与MD4恰恰就是与此类似的!因为安全性不强的缘故,现在已经很少或是没有地方使用了!至少现在的系统中我还没有看到过.

主要介绍其中的五种实现方式:短轮询、Comet、Flash XMLSocket、Server-sent、WebSocket

1、短轮询

指在特定的的时间间隔(如每10秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。浏览器做处理后进行显示。无论后端此时是否有新的消息产生,都会进行响应

2、Comet

包括了长轮询和长连接,长轮询是客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求;长连接是在页面中的iframe发送请求到服务端,服务端hold住请求并不断将需要返回前端的数据封装成调用javascript函数的形式响应到前端,前端不断收到响应并处理

3、Flash XMLSocket

在 HTML 页面中内嵌入一个使用了 XMLSocket 类的 Flash 程序。JavaScript 通过调用此 Flash 程序提供的socket接口与服务器端的socket进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很容易地控制 HTML 页面的内容显示

4、Server-sent

服务器推指的是HTML5规范中提供的服务端事件EventSource,浏览器在实现了该规范的前提下创建一个EventSource连接后,便可收到服务端的发送的消息,实现一个单向通信。客户端进行监听,并对响应的信息处理显示

5、WebSocket

WebSocket是HTML5下一种新的协议,是基于TCP的应用层协议,只需要一次连接,便可以实现全双工通信,客户端和服务端可以相互主动发送消息。客户端进行监听,并对响应的消息处理显示

针对自己系统的应用场景选择合适的推送方案才是合理的,因此最后简单说一下实现个性化推送的两种方式。第一种很简单,直接使用第三方实现的推送,无需复杂的开发运维,直接可以使用。第二种就是自己封装,可以选择如今较为火热的WebSocket来实现系统的推送。

关于第三方推送平台,极光推送,操作简单,稳定性高,送达率快