浅谈Javascript设计模式

什么是模式

模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题。

也就是说用来解决常见问题的可复用的解决方案。

常见的js设计模式

Constructor(构造器)模式

Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法。

这是我们最常用的一种设计模式。

Object构造器

比如在js中新建一个对象,就是以js中的Object构造器,新建一个Object的实例,这就是构造器模式。

(举例)

基本Constructor构造器

除了js自带的Object构造器,还可以自己通过构造函数,写一个基本的Constructor构造器。通过构造函数新建的实例也是用的构造器模式。

(举例)

Module(模块)模式

现在js都是模块化编程,所以在模块化这方面也有很多的模式。

最开始的时候,我们都用一个对象来分割模块,把所有的东西通过字面量写到一个对象里取,这种模式就是对象字面量表示法。

(举例)

对象字面量表示法把属性和方法都直接暴露在外,但是我们需要一些私有的属性和方法的时候,对象字面量表示法就很不方便了。所以在此基础上改进,我们有了Module模式。

Module模式使用闭包封装“私有“状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止其泄露至全局作用域并与别的开发人员的接口发生冲突。

通过该模式,只需返回一个公有API,而其他的一切则都维持在私有闭包里。

(举例)

Revealing Module(揭示模块)模式

Revealing Module,揭示模块模式,其实是module模式的升级版。它能够在私有范围内简单定义所有的函数和变量,并返回一个匿名对象,它拥有指向私有函数的指针,该函数是他希望展示为公有的方法。

(举例)

Singleton(单例)模式

单例模式,就是限制了类的实例化次数只能一次。在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,他会简单返回该对象的应用。

比如,可以用Singleton充当共享资源命名空间,从全局命名空间中隔离出代码实现,从而为函数提供单一访问点。

(举例)

Observer(观察者)模式

观察者模式就是,一个对象(称为subject)维持一系列依赖于它(观察者)的对象,将有关状态的任何变更自动通知给它们。

一系列对象(观察者)依赖于一个对象(subject),这个对象(subject)维持着和这些观察者对象的关系,有关状态发生的任何变更都将由这个对象(subject)自动通知给这一系列的对象(观察者)。

也就是,一群观察者依附在目标对象上,然后,当具体观察者的具体目标发生变化时,具体目标向目标发出通知,然后通过目标对象将这个具体目标的变化通知到所有的观察者。

(举例)

比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。

比如有个“天气中心”的具体目标A,专门监听天气变化,而有个显示天气的界面的观察者B,B就把自己注册到A里,当A触发天气变化,就调度B的更新方法,并带上自己的上下文。

(举例)

Publish/Subscribe(发布/订阅)模式

比较概念的解释是,订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码。

比如有个界面a是实时显示天气,它就订阅天气事件(注册到调度中心c,包括处理程序),当天气变化b时(定时获取数据),b就作为发布者发布天气信息到调度中心c,调度中心就调度订阅者a的天气处理程序。

Publish/Subscribe模式使用了一个主题/事件通道,这个通道介于希望收到通知(订阅者)的对象和激活时间的对象(发布者)之间。该事件系允许代码定义应用程序的特定事件,这些事情可传递自定义参数,自定义参数包含订阅者所需的值。其母的是避免订阅者和发布者之间产生依赖关系。

(举例)

观察者模式和发布/订阅模式还是很像的,都是通过注册到某个目标里,然后目标发生改变的时候,通过目标上的接口将这个改变通知到所有预先注册过的对象,

也就是说,这两种模式都带有订阅和发布的功能,发布/订阅模式多了一个中间者,可以避免订阅者(观察者)和发布者(目标)直接耦合。

Mediator(中介者)模式

Mediator模式存进松散耦合的方式是:确保组件的交互式通过这个中心点来处理的,而不是通过显示地引用彼此。

中介者模式是指用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单地说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别与“中介”对象引用或者依赖。

中介者模式并不带有监听改变和广播的功能,只是为其他的对象提供一个中介,使对象之间的耦合关系减弱。

(举例)

Prototype(原型)模式

Prototype模式为一种基于现有对象模板,通过克隆方式创建对象的模式。

也就是深复制。也就是传值赋值。

(举例)

Command(命令)模式

不懂,无法解释

Facade(外观)模式

不懂,无法解释

Factory(工厂)模式

是一种创建型模式。它不显式的要求使用一个构造函数。Factory提供一个通用的接口来创建对象。

比如jQuery。常用的$(‘#wrapper’)就是一个工厂模式,通过这个$之后,这个就变成了jQuery对象,然后就具有jQuery对象的各种属性和方法。

Mixin模式

不懂,无法解释

Decorator(装饰者)模式

这个,在es7里有用到。

简单的说,Decorator提供了将行为动态添加至系统的现有类的能力。其想法是,装饰本身对于类原有的基本功能来说并不是必要的;否则,它就可以被和并到超类本身了。

装饰者可以用于修改现有的雄,希望在系统中为对象添加额外的功能,而不需要大量修改使用它们的底层代码。

Flyweight(享元)模式

不懂,无法解释