Javascript乱弹设计模式系列(3) - 装饰者模式(Decorator)
2010-09-14 13:35:20 来源:WEB开发网现在执行它:
var manifdder = new Manifdder();
manifdder = new PrintDecorator(manifdder);
alert(manifdder.print()); //得到“Print!”
从结果可以看出,manifdder引用的对象具有方法print;
如果我继续装饰一个MakeInChina:
var manifdder = new Manifdder();
manifdder = new PrintDecorator(manifdder);
manifdder = new MakeInChinaDecorator(manifdder);
alert(manifdder.print()); //得到“manifdder.print is not a function”
从结果可以看出,print已经找不到了。
这说明MakeInChinaDecorator装饰manifdder的时候,它的父类ManifdderDecorator不包含print方法,所以自然就调用不到;
这个问题要如何解决呢?我们看到ManifdderDecorator的构造函数传进来一个manifdder的引用,通过它的引用我们可以得到它可能含有的新方法,比如print,通过和接口方法的比较,将新进的方法,动态添加进ManifdderDecorator中,于是我们修改ManifdderDecorator抽象类,如下所示:
function ManifdderDecorator(manifdder) {
this.manifdder = manifdder;
this.interface = IManifdder;
for(var key in this.manifdder)
{
if(typeof this.manifdder[key] !== "function") //判断是否为方法类
continue;
var i;
for(i = 0, len = this.interface.methods.length; i < len; i++) {
if(key == this.interface.methods[i][0]) { //通过遍历比较在接口类中是否包含此方法,如果包含返回下一个
break;
}
}
if(i < this.interface.methods.length)
continue;
var decorator = this;
//采用匿名函数调用方式来定义新方法
(function(methodName) {
decorator[methodName] = function() {
return decorator.manifdder[methodName]();
};
})(key);
}
Interface.registerImplements(this, IManifdder);
};
ManifdderDecorator.prototype = {
//
};
Tags:Javascript 乱弹 设计模式
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接