装饰者模式
目的
动态的包装对象,使之具有额外的能力。
何时使用
- 对象的责任和行为需要动态改变
举例
当我们发送邮件的时候,如果邮件是发送到公司外网,往往会加上保密说明等附加信息,这时候邮件本身并没有改变,可以用装饰者模式。
代码
下面的例子中,一台macbook不断增加配件,所以价格也不断变化,可以看到这么写代码还是比较漂亮的。
// The constructor to decorate
function MacBook() {
this.cost = function () { return 997; };
this.screenSize = function () { return 11.6; };
}
// Decorator 1
function memory( macbook ) {
var v = macbook.cost();
macbook.cost = function() {
return v + 75;
};
}
// Decorator 2
function engraving( macbook ){
var v = macbook.cost();
macbook.cost = function(){
return v + 200;
};
}
// Decorator 3
function insurance( macbook ){
var v = macbook.cost();
macbook.cost = function(){
return v + 250;
};
}
var mb = new MacBook();
memory( mb );
engraving( mb );
insurance( mb );
// Outputs: 1522
console.log( mb.cost() );
// Outputs: 11.6
console.log( mb.screenSize() );
注意cost接口是不变得。这和静态语言是一致的。