一、装饰者模式的作用
为函数或者对象的方法添加一些行为。
二、装饰者模式的原理
装饰者模式不是直接修改对象,而是以要修改的对象为基础,新建一个对象。不过这个新建的对象看起来就像在原对象的基础上增添了一些行为而已。
1、在对象中使用装饰者模式:就是把对象作为参数传入另一个构造函数中,然后这个构造函数里面就利用这个对象,创造出一个新的附加了一些行为的对象。2、在函数中使用装饰者模式:把函数传入另一个函数中,然后返回一个以参数函数为基础的函数。
三、装饰者模式的简单例子
需求一:
我们要创建一个游戏,里面的人物可以装备一些剑盾等道具。
实现一:
function Person(personName) { this.name = personName; } Person.prototype.showEquipment = function() { return '';//由于一开始人物是没有装备的。所以是空 }; //一个装饰者类,可以用来装备剑 function equipSword(person) { this.person = person; this.name = person.name; } equipSword.prototype.showEquipment = function() { return this.person.showEquipment() + 'sword;'; }; //一个装饰者类,可以用来装备盾 function equipShield(person) { this.person = person; this.name = person.name; } equipShield.prototype.showEquipment = function() { return this.person.showEquipment() + 'shield;'; };
//使用 var person = new Person('guoqinglinag'); alert(person.showEquipment());//一开始什么都没有装备 person = new equipSword(person); alert(person.showEquipment());//装备了sword之后,会显示sword person = new equipShield(person); alert(person.showEquipment());
需求二:
我们有一个函数,调用它会输出一串字符串。我们现在要求这个函数输出的都是大写。
实现二:
//一个输出一串字符串的函数 function echoStr() { return 'this is a string'; } //一个装饰者函数 function toUpperCase(func) { return function() { return func().toUpperCase(); } } //使用 alert(echoStr()); echoStr = toUpperCase(echoStr); alert(echoStr());