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;
}