概念:可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。
出现原因:在装饰者出现之前,我们都是用继承给对象添加功能,但是继承也不是万能的,会出现一些瑕疵,装饰者模式的出现就恰恰弥补了这些瑕疵。
- 继承的超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变;
- 继承的超类的内部细节对子类是可见的,会被认为破坏了封装性。
举栗子(假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第三级时可以发射原子弹。):
var plane = {
fire: function(){
console.log( '发射普通子弹' );
}
}
var missileDecorator = function(){
console.log( '发射导弹' );
}
var atomDecorator = function(){
console.log( '发射原子弹' );
}
var fire1 = plane.fire;
plane.fire = function(){
fire1();
missileDecorator();
}
var fire2 = plane.fire;
plane.fire = function(){
fire2();
atomDecorator();
}
plane.fire();
// 分别输出: 发射普通子弹、发射导弹、发射原子弹
装饰者模式和代理模式看起来相像,但它们有明显的不同:
代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。本体定义了关键功能,而代理提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情。
装饰者模式的作用就是为对象动态加入行为,装饰者模式用于一开始不能确定对象的全部功能时。。
网友评论