【发布时间】:2011-07-23 11:13:59
【问题描述】:
你们中的大多数人都知道装饰器模式的披萨/咖啡示例。
Pizza* pizza1 = BigPizzaDecorator(MushromDecorator(SimplePizza()));
Pizza* pizza2 = MushromDecorator(BigPizzaDecorator(SimplePizza()));
这两个对象的行为方式相似,但不完全,特别是如果您有非交换操作,例如:
BigPizzaDecorator::price() { return 10 + PizzaDecorator::price(); } // this is commutative
BigPizzaDecorator::name() { return "big " + PizzaDecorator::name(); } // this is not commutative
所以pizza1和pizza2的价格是一样的,但是名字不一样,比如第一个应该是"Big mushroom pizza",第二个应该是"Mushroom big pizza"。第一个是英语正确的(可能更好的是“蘑菇大披萨”,但它不是那么重要)。
《Head first》一书通过 Cofee 的例子指出了这个问题:
当您需要查看装饰器链的多个层时,您 开始将装饰器推到超出其真正意图的范围内。
尽管如此,这样的事情是可能的。想象一下调味品PrettyPrint 解析最终描述并可以打印“Mocha, Whip, 摩卡”作为“鞭子,双摩卡”。
最好的方法是什么? (operator<?)
【问题讨论】:
-
哪一个并不重要,关键是我想要
pizza1.name()和pizza2.name()的输出相同。
标签: c++ design-patterns decorator