《JavaScript设计模式与开发实践》之装饰者模式

概念:可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。

出现原因:在装饰者出现之前,我们都是用继承给对象添加功能,但是继承也不是万能的,会出现一些瑕疵,装饰者模式的出现就恰恰弥补了这些瑕疵。

  1. 继承的超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变;
  2. 继承的超类的内部细节对子类是可见的,会被认为破坏了封装性。

举栗子(假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第三级时可以发射原子弹。):

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();
// 分别输出: 发射普通子弹、发射导弹、发射原子弹

装饰者模式和代理模式看起来相像,但它们有明显的不同:
代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。本体定义了关键功能,而代理提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情。
装饰者模式的作用就是为对象动态加入行为,装饰者模式用于一开始不能确定对象的全部功能时。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我气的不是你诋毁我,而是你因为一件事情失去理智
    牛奶Oo面包阅读 181评论 0 0
  • 昨晚在给宝宝洗脚的时候无意问了他一个问题:你喜欢什么样的妈妈啊?他不假思索地说:“任何时候。” 其实听到这样的回答...
    莫莫豆丁阅读 189评论 0 0
  • 她向往哪样生活,连她自己都不知道。好像她从出生到她二十五岁时,她的父母亲就没有教过她,学校里的老师也没教,她上大学...
    Mr_稻香老农阅读 1,188评论 81 114
  • 朋友们还是没能适应“嘻嘻”这个名字,不管是有意还是无意,每次都问我家“淑芬”最近怎么样了。作为一只猫它无法选择自己...
    光泽叔叔阅读 724评论 2 6