代码之家  ›  专栏  ›  技术社区  ›  leeand00

当在decorator模式中调用decorator(在方法的开头或结尾)时,这是否重要?

  •  0
  • leeand00  · 技术社区  · 16 年前

    我正在用JavaScript实现一个装饰器模式。

    我看过这个例子 here 维基百科

    // Class to be decorated
    function Coffee() {
        this.cost = function() {
        return 1;
        };
    }
    
    // Decorator A
    function Milk(coffee) {
        this.cost = function() {
        return coffee.cost() + 0.5;
        };  
    }
    
    // Decorator B
    function Whip(coffee) {
        this.cost = function() {
        return coffee.cost() + 0.7;
        };
    }
    
    // Decorator C
    function Sprinkles(coffee) {
        this.cost = function() {
        return coffee.cost() + 0.2;
        };
    }
    
    // Here's one way of using it
    var coffee = new Milk(new Whip(new Sprinkles(new Coffee())));
    alert( coffee.cost() );
    
    // Here's another
    var coffee = new Coffee();
    coffee = new Sprinkles(coffee);
    coffee = new Whip(coffee);
    coffee = new Milk(coffee);
    alert(coffee.cost());
    

    现在我的问题是模式 仍然是 decorator模式,在cost()函数的开头或结尾调用父类是否重要?

    现在,我意识到这取决于每个装饰师的工作……例如,如果您在装饰器中进行乘法或除法,而不是加减法,那么它当然会保证得到不同的结果。

    但是,除了上一段中所述的原因之外,是否有任何理由在之前或之后打电话?

    4 回复  |  直到 16 年前
        1
  •  1
  •   ASk    16 年前

    没关系。装饰器应该改变一个对象的行为方式,它是如何做的,这纯粹是一个实现问题。

        2
  •  1
  •   tomjen    16 年前

    您显然对编程很感兴趣,而且非常熟练,但是请注意 任何事都是危险的。编程几乎没有简单的答案,如果你认为你找到了一个,有人在利用你。

    相反,只需尽可能多地学习工具,了解它们的优点和缺点,知道它们何时合适,何时需要修改。

        3
  •  0
  •   Scott Stanchfield    16 年前

    当心

    new X(new Y(new Z())))
    

    类型构造。这有几个陷阱(我是Java人,所以我提到了几个Java示例,但是这些概念在任何地方都适用)。

    • 您没有访问嵌套对象的权限

      • 有时你需要它,就像你在装饰Java IO对象和关闭()失败一样,你需要尝试关闭嵌套对象。
      • 有时您需要或想要设置额外的数据
      • 有时需要从嵌套项(new printwriter(new StringWriter())中获取结果--需要从StringWriter中获取结果字符串
    • 如果您得到一个异常(或其他类型的错误),很难根据报告的行号判断发生了什么。

    • 调试时很难完成(取决于调试器)
    • 在中间插入东西比较困难
    • 中间的东西很难去掉
    • 重新安排订单比较困难
        4
  •  0
  •   leeand00    16 年前

    好的,找到答案了。

    我回去重新阅读了我的设计模式书中的装饰模式部分,发现:

    “装饰者添加了自己的行为 之前和/或之后 委托给它所装饰的对象来完成剩余的工作。”

    重点是前位和/或后位…

    很抱歉打扰你,谢谢你的回答。

    推荐文章