《Learning Javascript Design Patterns》小结

js小白,这两天看了Addy Osmani的javascript设计模式,今天来小结下看到几个设计模式。
1.Module Pattern:
顾名思义是将一些共同的功能封装成一个模块,以供其他模块使用。由于javascript语言本身并不像java、python等这些语言本就支持跨文件,所以就出了Module Pattern这一设计模式专门来解决,也可以说java等语言在语法层面就已经应用了这个模式。
JS的模块总的来说是使用对象来实现的,每个文件可以当成一个模块看待。当引入一个文件时则相当于将整个文件(或者文件的某些可见变量)封装成了一个对象,文件对外可见(export)的变量则是这个对象的属性。
JS语言原生不支持模块,而是通过不同的第三方库来实现的,所以使用的库不同则模块的使用也会有所差异,总的来说以server/client两个领域来区分, server端的主要有nodejs(required/module.exports)和commonjs库版的,,client的则是遵循AMD(asynchrolize module define)的一些类库,如requirejs。

2.Singeton Patterns:
保证某个class只会存在一个实例。js这里有两点需要注意:
1.JS并没有真正意义上的成员变量权限控制(private/publish)这样的概念,所以一般都是通过闭包来屏蔽外部对类的直接访问,通过在闭包里定义变量,而后返回的一个包含开放变量的对象给外部使用,这样也能达到控制外部无法自由的创建闭包内定义的类。
2.基于各种考虑(无用的内存占用和对其他还未实例化的对象的依赖)我们并不希望所谓的单例是在程序初始化之初就创建(饿汉模式),而是第一次使用时才创建(懒汉模式)。所以最好不要通过简单的定义一个匿名的对象来实现js的单例,而是使用闭包来返回一个用于创建单例的factory对象。
不推荐直接创建单例对象:

    var singeton = (function(){
    ...
    //may dependenced on some object that has not been init
    })();

推荐使用工厂方法:

var factory = function() {
    function Cls() {
        this.get = function() {
            return "value";
        }
    }
    var instance;
    return {
        getInstance : function() {
            if(!instance){
                instance = new Cls();
            }
            return instance;
        } 
    };
}
factory.getInstance().get();

3.Observer Patterns:
某个subject持有一个observer列表,改变时就遍历列表通知所有观察者。纯粹的观察者模式只是让被观察者和观察者互相持有,来实现两者之间的交互。这个其实是不太好的,比较耦合。

4.Mediator Patterns:
就是使用一个Mediator来维系不同系统之间的关系,降低不同系统之间的耦合。当某个系统发生改变时不会影响其他的系统,这个方便了代码的编写,但是在review时则会比较难看懂不同系统的联系。

5.Public/Subscribe Patterns:
具备Observer Patterns的能力。但是该模式通过一个主题(Topic)来作为中介,subscriber向Topic订阅某个消息, 而消息也是通过topic来public,所以极大的降低了subscriper和消息发布者之间的耦合度.个人感觉就是Observer Patterns和Mediator Patterns的综合应用.
这个设计模式是最常用的。无论是服务端的多个线程模型(如actor)还是dom的事件机制都是基于这个设计模式的。

6.Prototype Patterns:
JS并没有class这个概念,它的对象都是通过Prototype来复制出来的(复制的是引用)。当访问一个对象的某个属性时,首先查看该对象是否有这个属性,如果没有的话则会向prototype查询,有的话则复制到对象中。因此对prototype的修改会影响所有由这个prototype衍生出来的对象。

7.Command Patterns:
对这个不感冒,感觉就是使用同一个接口来调用不同的操作,俗称一个Command.

8.Facade Patterns:
一个对外完全屏蔽细节的设计模式,调用者完全不关系内部是如何实现的,只需要看看这个门面提供了什么样的功能。如可以将对象管理这样的功能就封装成一个门面。

9.Factory/Abstract Factory:
factory不是直接通过一个constructor来创建一个对象的,而是提供一个factory方法,然后根据不同的参数来创建不同的对象。abstract factory则是更加的灵活的,将factory方法都抽象化了,这样就可以在生产过程中动态的注册新的factory从而创建更多种类的对象了。

10.Decorator Patterns:
Decorator不像java类中的继承,它是让一个对象装饰 一个对象,然后动态的添加某些新的功能。这里的关键之处则是动态二字。

11.Flyweight Patterns:
享元模式的目的是最大程度上复用对象。它将统一的管理某一类的对象(对象池吧),然后在使用时从里面获取这些对象。最终的目的就是在需要的对象已经存在时就不会再次创建,而是复用已经存在的对象。

12.MV* Patterns:
该模式是设计大型框架必备的。从smalltallk-80中的mvc到现在,有MVC、MVP、MVVM等等变种。
M-Model, V-View C-Controller P-Prensenter VM-ViewModel
这几种设计模式的区别主要在第三个部分的职司。大部分情况下,前面的MV分别包含了数据和表现:

MVC:View直接从Model出获取数据然后呈现,但V中收到外接的修改时通知Controller,然后Controller修改Model

Created with Raphaël 2.1.0 Model Model View View Controller Controller pull data notification user's operator change data

MVP:渲染时Prensenter从Model获取数据,然后将数据填充到View中呈现。View和Model改变时都会通知Prensenter,然后Prensenter则将修改同步到另一个部分中

Created with Raphaël 2.1.0 Prensenter Prensenter Model Model View View push data render data to view notification user's operator change data

MVVM:从一定程度上将复杂的逻辑操作分离出这个体系中了。一个VM总会对应着一个View,它将View以及跟View有关的Model作为本身的属性。可以说ViewModel是一个特殊的View。

Created with Raphaël 2.1.0 Model Model ViewModel.properties ViewModel.properties ViewModel ViewModel View View be reference render change ViewModel.properties(Model)

你可能感兴趣的:(设计模式)