1. 程式人生 > >09.Javascript設計模式之裝飾器模式----Decorator

09.Javascript設計模式之裝飾器模式----Decorator

引入正題,本文將以我這段時間對裝飾者模式的學習、理解為基礎,向大家介紹Javascript設計模式中的裝飾器模式。我的理解程度非常有限,因此文件也不會描述的非常的周全,還請您做好心理準備。

裝飾器模式的概念

裝飾器模式動態地將職責附加到某物件上,讓該物件具備了其原本不具備的一些特性。其有別於類繼承,因為在功能擴充套件方面,裝飾器模式提供了比類繼承更有彈性的替代方案,而且完全不會影響到該物件在其他領域或模組中的應用。

有網友對裝飾器給出了這樣的總結,我覺得非常的好,所以摘錄了下來:

裝飾器涉及四個名詞 

1、介面或者抽象基類

2、被裝飾物件,也就是一個簡單的實現了1中提到的介面或者抽象基類的實現類

3、裝飾物件,就是去裝飾被裝飾物件的物件 

4、繼承裝飾物件類的子類,也就是具體的裝飾器類了

裝飾器模式示例

第一個名詞

var IDecorator = new Interface("IDecorator",["sayHello"]);

第二個名詞

var DecoratorImpl = function(){};
implements(DecoratorImpl,IDecorator);
DecoratorImpl.prototype.sayHello = function(){
    alert("Hello...");
};

第三個名詞

真正的裝飾器就在這裡開始了,也是所有欲實現裝飾器的父類

var Decorator = function(decorator
){ //宣告一個需要被裝飾的物件,引數從構造器中獲得 this.decorator = decorator; }; implements(Decorator,IDecorator); //在基類裝飾器中只調用被裝飾物件的方法 Decorator.prototype.sayHello = function(){ //注意這裡的程式碼 this.decorator.sayHello(); };

再對這個裝飾器的基類說明一下,在每個裝飾器模式中,這個類的結構基本不變 或者說這上面是裝飾器第三類名詞中最小的類了,必須有以上定義的這些元素。

第四個名詞

真正的裝飾就看這裡了,Please pay attention!

var SimpleDecorator = function(decorator){
    //呼叫父類的構造器
    this.superClass.prototype.constructor.call(this,decorator);
};

//先進行類繼承
inherits(SimpleDecorator,Decorator);

//下面開始裝飾
SimpleDecorator.prototype.sayHello = function(){
    //在原來的方法中加入了sayChina方法
    this.sayChina();

    //呼叫父類的sayHello
    this.superClass.prototype.sayHello.call(this);

    //在原來的方法中加入sayWorld方法
    this.sayWorld();
};

//定義這兩個後來新增的方法
SimpleDecorator.prototype.sayChina = function(){
    alert("China ,");
};

SimpleDecorator.prototype.sayWorld = function(){
    alert("World!");
};

大膽的開始測試

var TestDecorator = function(){
    //不使用裝飾器
    this.unUseDecorator = function(decorator){
        decorator.sayHello();   //這裡列印:Hello
    };

    //使用裝飾器
    this.useDecorator = function(decorator){
        var simpleDecorator = new SimpleDecorator(decorator);
        simpleDecorator.sayHello(); //這裡列印China,Hello World!
    };
};

不要驚訝,裝飾器就是這麼強悍,把原來不變的方法改變了。

總結

那我們就來談談他的使用場景吧:

1、裝飾器模式主要裝飾供外部呼叫的介面方法,如果一個介面方法只是提供給內部呼叫,則不能使用該模式。 

2、裝飾器模式主要裝飾可能要改變的介面方法,如果類中的某種行為在將來可能發生變化,而你又懶得去改變 原來的類,那麼就可以考慮使用裝飾器模式了。

OK,就說到這裡了先,再續...