什么是装饰器模式?

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

实例

拿最近比较火的吃鸡游戏(绝地求生:大逃杀PUBG)来说,游戏中每个玩家降落到岛上,刚开始是一无所有的,需要通过捡拾或掠夺装备来武装自己,然后经过互相残酷的拼杀,获得游戏的胜利。

游戏过程中,我们可以把每一个玩家当成需要装饰的主类。其余的武器当成装饰类。玩家可以被任何武器装饰,从而获得不同的能力。

下面例子中,玩家主类分别通过手枪类和狙击步枪(Kar98)类修饰后,强化了自身的 fire 方法。获取了不一样的功能。与此同时,类里的其他方法 sayName 并没有受到装饰器的影响。

// 被装饰的玩家
class Player {constructor(name) {this.name = name}sayName() {console.log(`I am ${this.name}`)}fire() {console.log('I can only punch!')}
}// 装饰器——手枪
class Pistol {constructor(player) {player.fire = this.fire}fire() {console.log('I shoot with my Pistol!')}
}//装饰器——Kar98狙击步枪
class Kar98 {constructor(player) {player.fire = this.fire}fire() {console.log('I shoot with my Kar98!')}
}// 新玩家
const player = new Player('zkk')//打招呼
player.sayName() // => 'I am zkk'// 现在还没有武器,只会用拳头
player.fire()  // => 'I can only punch!'// 哎,捡到一个手枪,装饰上
const playerWithPistol = new Pistol(player)// 发现敌人,用手枪开火
playerWithPistol.fire()  // => 'I shoot with my Pistol!'// 哇!捡到一个98K,装饰上
const playerWithKar98 = new Kar98(player)// 用98k开火,奈斯!
playerWithKar98.fire() // => 'I shoot with my Kar98!'

通过实例,我们可以看出装饰器模式可以动态地给一个对象添加一些额外的功能,同时结构上更加灵活。

如果不使用装饰者模式,为了实现以上功能,我们就需要对玩家和各种武器的组合创建无数多的类,在需要的时候再去实例化。这样的管理是非常复杂的。

优点缺点

优点
  • 装饰类和被装饰类可以独立发展,不会相互耦合
  • 装饰模式是继承的一个替代模式
  • 装饰模式可以动态扩展一个实现类的功能,而不必担心影响实现类
缺点
  • 如果管理不当会极大增加系统复杂度
  • 多层装饰比较复杂
  • 不熟悉这个模式的开发人员难以理解

扩展

目前 TS 和 ES7 已经支持装饰器的使用,下面是新语法中方法装饰器的使用。

方法装饰器表达式会在运行时当作函数被调用,传入下列3个参数:

  • target——对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
  • name——成员的名字。
  • descriptor——成员的属性描述符。
// 定义kar98方法装饰器
let kar98 = (target, name, descriptor) => {const oldValue = descriptor.value// 装饰器中替代原先的fire方法descriptor.value = function () {oldValue.apply(null, arguments)target.sayName()console.log(`${name}功能被增强`)console.log('I can fire with kar98!')}
}// 玩家类
class Player {sayName() { console.log('I am zkk')}// 用kar98装饰器装饰fire方法,就可以升级能力了。@kar98fire(s: string){// 默认如果没有装饰器,只能拳击console.log(s)}
}const player = new Player()player.fire('I can punch!')

输出:

除了方法装饰器,还有类装饰器,属性装饰器,参数装饰器等等。使用详情可以参照 TS 使用手册装饰器一节

JS设计模式——装饰器模式相关推荐

  1. js设计模式-装饰器模式

    装饰器模式 在不改变其原有的结构和功能为对象添加新功能,装饰比继承更加灵活. 就像你有一把狙击枪它需要消音的功能,我们就可以装上一个消音器.要一个四倍镜就可以 装上四倍镜,然后是握把,枪架等等.可以把 ...

  2. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  3. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  4. Spring设计模式(装饰器模式)

    Spring设计模式(装饰器模式) 模式的定义: 装饰者模式定义: ​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 模式的结构图 : 模式包含角 ...

  5. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

  6. 设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.简单来说,装饰器模式就是 ...

  7. PHP设计模式——装饰器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装 ...

  8. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  9. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

最新文章

  1. typera插入网站
  2. python爬虫课件_Python爬虫教学视频(附课件)
  3. 华为30pro什么时候能升鸿蒙,荣耀30Pro、荣耀30Pro+什么时候升级鸿蒙系统 荣耀30Pro、荣耀30Pro+怎么升级鸿蒙系统...
  4. 各品牌类型电脑BOIS中USB模式启动热键
  5. 水印相机定位不准确怎么办_禄来的广角双反相机(2020版)
  6. codeforces 271A-C语言解题报告
  7. 定时任务的实现原理,看完就能手撸一个!
  8. 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
  9. VC中对CString 的读写(ini文件)
  10. 使用Python实现批量发送邮件
  11. UI动画的一些制作过程
  12. ProE/Creo免费插件 MCADEx Tools 5.0
  13. opensips搭配rtpengine实现sip信令和rtp流的代理
  14. android设置背景图片透明
  15. python实现下载压缩包并且解压
  16. c语言c11标准侯捷,C++新标准 C++11/14课件 (侯捷) 完整PDF
  17. 该虚拟机似乎正在使用中
  18. 多项式函数在某一点处的泰勒展开
  19. goland dlv调试正在运行的程序
  20. Hexo--博客搭建

热门文章

  1. 谷露专访铃盛Sr. TA Manager:从0到1搭建雇主品牌的流程化管理和文化法则
  2. 可以使用PHP语言设计静态网页,用PHP往实现静态化
  3. 关于论文分两栏的问题
  4. 多协成利用互斥锁按顺序执行读取文件
  5. JZOJ 5495 MiniumCut (最小割树)
  6. 初识爬虫 - xpath 简单应用(扇贝单词)
  7. 新形势下保险机遇与机会(加微信有高级课程赠品)
  8. CCF推荐会议和期刊:人工智能方向(2019)
  9. 一步一步教你用U盘制作一张Win10系统启动盘(小白必看)
  10. 学习comsol的神级经验