您的位置:首页 > Web前端 > JavaScript

Javascript Patterns--读书笔记10 (Decorator)

2012-10-11 22:19 375 查看
Decorator模式是指可以在运行的时候让一些功能附加到对象上,当在静态类语言中实现的时候,也许不那么容易,但是在JS中,我们借助于它自己的语言特性,可以很容易的让其实现这种模式
应用场景
让我们来看一个这个模式应用的例子,假若你现在正在做一个卖东西的web应用。假设每一件新的商品,我们都抽像为一sale object,我们可以通过sale.getPrice()来得到商品的价格。假定这样一个场景,一个顾客在加拿大的Qubec省买了这样一件产品,那么他需要交纳联邦政府的税,还需要交纳Qubec省的税。我们可以这样来应用decorate模式,用联邦政府税decorator和Qubec省税deocraor来decorate它。我们来看下面的示例代码.

var sale = new Sale(100);//商品的价格是100
sale = sale.decorate('fedtax');//联邦征税
sale = sale.decorate('quebec');//省征税
sale = sale.decorate('money');//加上税以后的价格
sale.getPrice();//112.88


而在另一个场景中,那个购买者可能是另外一个省的,而这个省对这件商品是不征税的,而不过它在结算的时候,用的是加拿大元,而不再是美元,那让我们来看下面的代码:

View Code

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

Sale.decorators = {};

Sale.decorators.fedtax = {
getPrice: function(price) {
return price + price * 5 / 100;
}
};

Sale.decorators.quebec = {
getPrice: function(price) {
return price + price * 7.5 / 100;
}
};

Sale.decorators.money = {
getPrice: function(price) {
return "$" + price.toFixed(2);
}
};

Sale.prototype.deocrate = function (decorator) {
this.decorators_list.push(decorator);
};

Sale.prototype.getPrice = function () {
var price = this.price,
i,
max = this.decorators_list.length,
name;
for(i =0; i < max; i+=1) {
name = this.decorators_list[i];
price = Sale.decorators[name].getPrice(price);
}
return price;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: