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
最后让为他增加“飞行”能力
增加装饰者:(这里的代码和原博客有些不同,做了简化,便于理解)
转载自淘宝前端团队
装饰模式是装饰模式,是通过封装其他对象达到设计的目的。
装饰模式不一样,仅仅包装现有的模块,使之“更加华丽”,并不影响原有接口的功能——好比你给收集添加一个外壳罢了,并不影响手机原有的通话、充电等功能。
理解装饰模式——锦上添花
装饰模式是为了让不修改类原有的接口的情况下表现得更好
举例:水可以直接喝,加上其他果汁会更好喝。手机贴不贴膜都可以使用,但有些人就是喜欢加个外壳防摔。
装饰模式场景——面向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}`);
关键:
装饰只针对特定对象,不针对原型。;
阅读全文
0 0
- JS—Decorator(装饰者)模式
- Decorator 装饰者模式
- 装饰者模式(Decorator)
- Decorator 装饰者模式
- 装饰者模式(Decorator)
- decorator装饰者模式
- 装饰者模式(Decorator)
- Decorator 装饰者模式
- 装饰者模式--Decorator
- 装饰者模式(Decorator)
- 装饰者(Decorator)模式
- 装饰者模式decorator
- Decorator 装饰者模式
- 装饰者模式-Decorator
- 装饰者模式Decorator
- 装饰者模式Decorator
- 装饰者模式Decorator
- 装饰者模式(Decorator):
- C# 8.0的三个令人兴奋的新特性
- 阿里云 Tomcat https 免费DV ssl证书安装(记录备忘)
- ActiveMQ
- 基础知识总结:关于继承
- Retrofit上传头像
- JS—Decorator(装饰者)模式
- clientX,pageX,screenX,offsetX,layerX,x的那些事
- 自定义VIew Demo (ViewGroup)
- Uncaught TypeError: UE.getEditor is not a function
- 分布式 RPC架构简单理解
- Redis 服务器
- ABP官方文档(三)【模块系统】
- Ubuntu 16.04 重置密码(忘记密码)
- webView回退功能