WEB开发网
开发学院网页设计JavaScript Javascript乱弹设计模式系列(3) - 装饰者模式(De... 阅读

Javascript乱弹设计模式系列(3) - 装饰者模式(Decorator)

 2010-09-14 13:35:20 来源:WEB开发网   
核心提示: 现在执行它:var manifdder = new Manifdder();manifdder = new PrintDecorator(manifdder);alert(manifdder.print()); //得到“Print!”从结果可以看出,manifdd

现在执行它:

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 = {
  //
};

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Javascript 乱弹 设计模式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接