TL; DR:
如何避免装饰器链中某些类的重复?
长版
我正在尝试按照 Head First Design Patterns 一书中的描述实现Decorator模式。他们提供的例子是星巴克咖啡店的收银机,其中饮料和各种调味品都是课程,系统的目的是计算价格。
我开始使用 iBeverage 界面,公开公共方法 getName()和 getPrice()。
iBeverage的实施是各种饮料类(虽然共享基类称为饮料;这些是 SlowDripCoffee , Latte 和卡布奇诺),以及各种调味品。
调味品实施为 iBeverageDecorators (扩展iBeverage的界面)。在它们的构造函数中,它们接受iBeverage的实例,该实例存储在内部。对getName()和getPrice()的调用实现为“对子进行调用getPrice(),添加自己的价格,返回值。”
如何制作高大豆焦糖拿铁的例子:
$drink = new SoyMilk(new CaramelSyrup(new Latte(Beverage::TALL)));
$price = $drink->getPrice();`
我的问题:我如何限制 - 仅限一些装饰者 - 它们最终在调用堆栈中的总次数?例如:如果商店想要将糖浆限制为每种饮料三种,或者他们想确保员工只在订单中添加一种类型的牛奶,该怎么办?
我的基本本能是添加一些反射,这样在构造过程中我们可以检查整个对象图并确定它是否是装饰器的有效目标......这是正确的方法吗?或者我在这里申请的模式不适合这项任务?任何建议都非常感谢。
这只是我为自己设定并找出的内容。
答案 0 :(得分:0)
通常情况下,这应该是一个问题,您可以手动构建链(您对其进行硬编码),或者您有一个构建器将装饰器添加到您可以控制它的链中。
我不会在装饰器类本身中放置任何代码,因为那时你会在整个地方传播关于这个的规则并使其变得不灵活且难以维护。
您使用的示例是关于能够应对已更改的规则和成分。