JS—Decorator(装饰者)模式

来源:互联网 发布:宇宙神运载火箭 知乎 编辑:程序博客网 时间:2024/06/15 16:36
http://taobaofed.org/blog/2015/11/16/es7-decorator/
转载自淘宝前端团队
装饰模式是装饰模式,是通过封装其他对象达到设计的目的。
装饰模式不一样,仅仅包装现有的模块,使之“更加华丽”,并不影响原有接口的功能——好比你给收集添加一个外壳罢了,并不影响手机原有的通话、充电等功能。
理解装饰模式——锦上添花
装饰模式是为了让不修改类原有的接口的情况下表现得更好
举例:水可以直接喝,加上其他果汁会更好喝。手机贴不贴膜都可以使用,但有些人就是喜欢加个外壳防摔。
装饰模式场景——面向AOP编程 AOP:面向切面编程
装饰模式经典的应用是AOP编程,比如“日志系统”,日志系统的作用是记录系统的行为操作,它在不影响原有系统的功能的基础上增加记录环节——好比你佩戴了一个智能手环,并不影响你的日常起居,但你现在却有了自己每天的行为记录。
更加抽象的理解,可以理解为给数据流做一层filter,因此AOP的典型应用包括安全检查、缓存、调试、持久化等等。
AOP编程应用场景:日志系统、辅助功能、安全检查、缓存、调试、持久化
以钢铁侠为例,钢铁侠本质是一个人,只是“装饰”了很多武器才变得那么NB,不过再怎么装饰它还是一个人。
示例场景:
首先创建一个普通的Man类,它的抵御值为2,攻击力为3,血量为3
然后我们让其带上钢铁侠的盔甲,这样他的抵御力增加100,变成102
让其带上光束手套,攻击力增加50,变成53
最后让为他增加“飞行”能力

这个代码IE8及以下不支持,IE9及以上没测试过

class Man{constructor(def = 2,atk = 3, hp = 3){this.init(def,atk,hp);}init(def,atk,hp){this.def = def; //防御力this.atk = atk; //攻击力this.hp = hp; //血量}toString(){return `防御力:${this.def},攻击力:${this.atk},血量:${this.hp}`;}}var tony = new Man();console.log(`当前状态 ===> ${tony}`);

增加装饰者:(这里的代码和原博客有些不同,做了简化,便于理解)

//盔甲装饰function decorateArmour(target) { target.def += 100;}//光束手套装饰function decorateLight(target) {target.atk += 50;}//增加飞行能力function decorateFly(target) {return target.toString() + ",Fly:true";}class Man{  constructor(def = 2,atk = 3,hp = 3){    this.init(def,atk,hp);  }  init(def,atk,hp){    this.def = def; // 防御值    this.atk = atk;  // 攻击力    this.hp = hp;  // 血量  }  toString(){    return `防御力:${this.def},攻击力:${this.atk},血量:${this.hp}`;  }}var tony = new Man();decorateArmour(tony);decorateLight(tony);tony = decorateFly(tony);console.log(`当前状态 ===> ${tony}`);

关键:

装饰只针对特定对象,不针对原型。;

原创粉丝点击