从“头先:设计模式”书中的装饰模式用例使我有这个问题。我会尽力把它写下来:使用列表而不是装饰模式?
这是一个咖啡厅系统与一些咖啡和大量的调味品 你可以把它们(需支付额外费用),你需要能够订购 和为了避免产生总的混乱(例如布尔值来追踪 调味品),使用Decorator Pattern来装饰任何调味品的咖啡。我们有一个抽象的饮料 类,每种类型的咖啡,混凝土构件和各调味品 混凝土装饰包裹起来的饮料,如:
因此,我们有以下过程返回咖啡成本:
我的问题是:为什么不使用列表,而不是装饰实现这个?我们可以在每个饮料中列出调味品列表,并通过遍历列表来计算成本。要订购的咖啡,我们就只需要一次实例并添加所需的调味品,避免类似的声明:
// Using second image example
Beverage beverage = new DarkRoast(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
此外,我们将有想放弃的折扣,咖啡不包括它的调味品操作更加灵活,一旦我们不会让装饰者包装咖啡。这是一个长期研究的问题,我知道我错过了一些东西,或者我错了,所以如果你对此有任何想法,我很想知道并进一步讨论它。
这不是关于折扣或税款清单,您必须扣除或按成本添加。这是关于您使用装饰模式处理的行为。而且,相信我,用列表而不是继承来处理这些行为是很困难的。 – freedev
你能用这个案例举个例子吗?或者可能是另一个随机情况我真的无法想象发生这种情况的情况。 – Paternostro
这似乎是一个更好的[softwareengineering.stackexchange.com](https://softwareengineering.stackexchange.com)的问题。就我个人而言,我认为这是Decorator的一个可怕的用法(维基百科也有类似的例子,我认为),绝对可以用一个更易于管理的方式用列表解决。 'java.io.InputStream'是装饰器的一个例子,它运行良好。但是,您已经可以看到有一位用户不同意我的观点,这就是为什么这可能与SO无关。 – Radiodef