对Javascript系列的深入理解(29):对设计模式的装饰模式的详细说明
介绍装饰器提供了一种比继承更灵活的替代方法。装饰器使用对象来包装和接口,不仅允许您向方法添加行为,而且允许将方法调用到原始对象(例如,装饰器的构造函数)。
装饰器用于以重载方法的形式添加新功能,它可以向装饰的人的前面或后面添加操作以达到特定的目的。
文本
那么装饰模式的优点是什么呢如前所述,修饰器是继承的替代品。当脚本运行时,子类中的行为会影响原始类的所有实例,而修饰器不会。相反,它可以向不同的对象添加新的行为:
复制代码代码如下所示:
/装饰类(函数)
功能MacBook(){
this.cost =函数(){
返回1000;
};
}
功能存储器(MacBook){
this.cost =函数(){
返回macbook.cost()+ 75;
};
}
功能bluraydrive(苹果){
this.cost =函数(){
返回macbook.cost()+ 300;
};
}
功能保险(MacBook){
this.cost =函数(){
返回macbook.cost()+ 250;
};
}
使用
无功mymacbook =新保险(新bluraydrive(新的内存(新的MacBook())))))
console.log(mymacbook.cost());
下面是另一个例子。当我们上调performtask在装饰,它不仅有装饰的行为,又称下层对象的performtask功能。
复制代码代码如下所示:
函数的ConcreteClass(){
this.performtask =函数(){
This.preTask();
console.log('doing东西);
This.postTask();
};
}
功能abstractdecorator(饰){
this.performtask =函数(){
Decorated.performTask();
};
}
函数的ConcreteDecoratorClass(饰){
this.base = abstractdecorator;
This.base(饰);
decorated.pretask =函数(){
console.log('pre-calling ..);
};
decorated.posttask =函数(){
console.log('post-calling ..);
};
}
VaR混凝土=新ConcreteClass();
无功decorator1 =新concretedecoratorclass(混凝土);
无功decorator2 =新concretedecoratorclass(decorator1);
decorator2.performtask();
一个更透彻的例子:
复制代码代码如下所示:
var树{ };
tree.decorate =函数(){
console.log(要知道树不会下降);
};
tree.getdecorator =功能(装饰){
树{装饰}。原型=这个;
返回新树{装饰};
};
tree.redballs =函数(){
this.decorate =函数(){
(这个。redballs。原型。装饰); / /第七步:原型的第一个实现(现在的天使)装饰方法
console.log(一些红色的球把); / /输出红第八步
2步装饰/ redballs
}
};
tree.blueballs =函数(){
this.decorate =函数(){
(这个。blueballs。原型。装饰); / /第一步:第一个实现装饰原型法,这是tree.decorate()
console.log('add蓝色球); / /输出蓝第二步
2步装饰/ blueballs
}
};
树=天使=函数(){
this.decorate =函数(){
(这个天使的原型。装饰); / /第四步:原型的第一个实现(现在blueballs)装饰方法
console.log(一个天使在上面'); / /输出天使第五步
2步装饰/天使
}
};
树= tree.getdecorator('blueballs '); / /第三步:的blueballs对象赋值给树,然后getdecorator仍可用在父亲的原型
树= tree.getdecorator(天使'); / /第六步:天使的对象被分配到树下,然后在原型getdecorator父亲父亲原型仍然是可用的
树= tree.getdecorator('redballs '); / /第九步:的redballs对象赋值给树
(树。装饰); / /第十步:的装饰方法的redballs对象的实现
总结
装饰者模式是一种方法来添加更多的动态存在的功能,每个装饰的功能在一个单独的函数,然后用包装的功能到现有的装饰功能的对象,因此,当你需要执行特殊动作,调用代码可以根据需要来选择,根据要使用的装饰作用对象包装。优点是分离这类的核心职责(功能)和装饰功能。