【发布时间】:2014-06-09 11:30:18
【问题描述】:
我指的是关于装饰器模式的维基百科文章,我发现coffee making example 非常有用。我在装饰器模式的大多数示例(包括上面的示例)中发现,除了修改合同中定义的属性/方法之外,装饰器不会添加自己的属性/方法。例如,咖啡制作示例中的 Milk 类 覆盖 Coffee 合约中定义的方法(getCost() 和 getIngredients())。如果 Milk 类想要添加自己的方法,例如 GetBrand() 或 GetQuantity(),该怎么办(请注意,客户端可能需要将其接口转换为 Milk 类才能访问这些方法)。虽然没有什么能阻止您向装饰器添加字段/方法,但我的问题是,除了合同中约定的内容之外,向装饰器添加字段/方法是否是一种好习惯?
我想到的一个解决方案是在合约中添加一个 Properties 字典(任何键值对),每个装饰器都可以将它们自己的属性添加到这个字典中。稍后,客户端可以使用他们的密钥访问属性。问题是大多数类的集合可能是空的。另外,我认为
milk.GetBrand()
比
更具可读性 milk.Properties.PropertybyName[cs_cost].
请分享您对这个问题的看法..
谢谢大家,
普雷迪普
【问题讨论】:
-
装饰器模式的“解决方案”可能是非常特定于语言的,因为不同的语言使实现该模式变得容易或困难。您是否正在寻找特定语言的解决方案?
-
不是真的...虽然我使用的是 C#..