我正在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()函数的开头或结尾调用父类,这是否重要?
现在我知道这取决于每个装饰器做什么......例如,如果你在装饰器中增加或分割而不是加或减,它当然会保证不同的结果。
但除了上一段所说的理由之外或之后,有没有理由接听电话?
答案 0 :(得分:1)
没关系。装饰器应该改变对象的行为方式,它是如何实现的。
答案 1 :(得分:1)
你显然对编程很感兴趣,并且非常熟练,但请注意,谈论 true 任何事情都是危险的。编程很少有简单的答案,如果你认为你找到了答案,那么有人会利用你。
相反,只需学习尽可能多的工具,了解它们的优点和缺点,并了解它们何时适用以及何时需要修改。
答案 2 :(得分:0)
小心
new X(new Y(new Z())))
类型结构。这有几个陷阱(我是一个Java人员所以我提到了几个Java示例,但这些概念确实适用于任何地方)
您无权访问嵌套对象
如果您收到异常(或其他类型的错误),很难根据报告的行号判断发生了什么
答案 3 :(得分:0)
好的找到了答案。
我回去重新阅读了我的设计模式书中的Decorator Pattern部分并找到了:
“装饰者在委托给它装饰的对象之前和/或之后添加自己的行为来完成其余的工作。”
重点放在前一位和/或后位......
很抱歉打扰了你,谢谢你的答案。