在装饰器模式中调用装饰器(在方法的开头或末尾)时是否重要?

时间:2009-06-05 18:00:09

标签: design-patterns decorator decorator-chaining

我正在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());

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

现在我知道这取决于每个装饰器做什么......例如,如果你在装饰器中增加或分割而不是加或减,它当然会保证不同的结果。

但除了上一段所说的理由之外或之后,有没有理由接听电话?

4 个答案:

答案 0 :(得分:1)

没关系。装饰器应该改变对象的行为方式,它是如何实现的。

答案 1 :(得分:1)

你显然对编程很感兴趣,并且非常熟练,但请注意,谈论 true 任何事情都是危险的。编程很少有简单的答案,如果你认为你找到了答案,那么有人会利用你。

相反,只需学习尽可能多的工具,了解它们的优点和缺点,并了解它们何时适用以及何时需要修改。

答案 2 :(得分:0)

小心

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

类型结构。这有几个陷阱(我是一个Java人员所以我提到了几个Java示例,但这些概念确实适用于任何地方)

  • 您无权访问嵌套对象

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

  • 调试时(取决于调试器)
  • 更难以逐步完成
  • 在中间插入一些东西更难
  • 在中间移除某些内容更加困难
  • 重新安排订单更加困难

答案 3 :(得分:0)

好的找到了答案。

我回去重新阅读了我的设计模式书中的Decorator Pattern部分并找到了:

  

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

重点放在前一位和/或后位......

很抱歉打扰了你,谢谢你的答案。