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