JS—Decorator(装饰者)模式

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}`);

关键:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值