javascript設計模式之裝飾器模式

javascript設計模式之裝飾器模式

裝飾器模式是一種結構型模式

有兩種常見的實現方法

第一種是利用原始對象原型的decorate方法,實現裝飾對象對上一個對象的繼承和方法重載。最終的對象是經過一系列裝飾的裝飾對象。

代碼如下:

Function Sale (price) {  
  this.price = price || 100;
}

Sale.decorators = {};

Sale.decorators.fedtax = {  
  getPrice: function () {  
      price = this.uber.getPrice();
      return price*2;
    }
};

Sale.prototype.getPrice = function () {  
  Return this.price;
};

Sale.prototype.decorate = function (decorator) {  
  Var F = function () {},
          overrides = this.constructor[decorator],
          I,newObj;

    F.prototype = this;
    newObj = new F();
    newObj.uber = this.prototype;

    for(I in overrides){  
        if(overrides.hasOwnProperty(i)){  
          newObj[i] = overrides[I];
        }  
    }

    return newObj;
}

第二種實現方法是列表形式,decorate方法會將裝飾對象裝到原始對象的decorate_list數組中,最終的getPrice方法會對所有的裝飾對象的屬性一起計算,這種方法不需要繼承。

代碼如下:

Function Sale (price) {  
    this.price = (price > 0) || 100;
    this.decorator_list = [];  
}

Sale.decorators = {};

Sale.decorators.fedtax = function () {  
    getPrice: function (price) {  
      return price*2;
    }  
}

Sale.prototype.decorate = function (decorator) {  
  this.decorator_list.push(decorator);
}

Sale.prototype.getPrice = function () {  
  Var price = this.price,
          max = this.decorator_list.length,
          I;

  for(I = 0;i < max;I++){  
      name = this.decorator_list[I];
      price = this.constructors[name].getPrice(price);
    }

    return price;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章