Decorator是一种结构型设计模式,用于促进代码复用,是一种可行的对象子类化的替代方案。Decorator提供了将行为动态添加到系统现有类的能力。其想法是,装饰者本身对于类原有的基本功能来说并不是必要的;否则,它就可以合并到超类本身。
装饰者可以用于修改现有的系统,希望在系统中为对象添加额外的功能,而不需要大量修改使用它们的底层代码。开发人员使用装饰者的一个原因是,应用程序可能包含需要大量不同类型对象的功能。
Decorator模式并不严重依赖于创建对象的方式,而是关注扩展其额外功能。我们使用了一个单一的基本对象并逐步添加提供额外功能的Decorator对象,而不是仅仅依赖于原型继承。这个想法是:向基本对象添加属性或者方法,而不是进行子类化 ,因此它较为精简。
在JavaScript中向对象添加新属性是一个非常简单的过程:
function Vehicle(vehicleType){
this.vehicleType = vehicleType || "car";
this.model="default";
}
var truck = new Vehicle("truck");
//给truck装饰新功能
truck.setModel = function (modelName){
this.model = modelName;
}
使用多个装饰者装饰对象:
function MacBook(){
this.cost = function(){
return 997;
}
this.screenSize = function(){
return 13;
}
}
//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;
}
}
var mb = new MacBook();
Memory(mb);
Engraving(mb);
装饰行为并没有重写原始MacBook对象的构造函数方法,原来的MacBook依然保持不变并完好无损。