扩展装饰器

时间:2014-06-09 11:30:19

标签: design-patterns decorator

我指的是关于装饰模式的维基百科文章,我发现coffee making example非常有用。我在装饰模式的大多数例子中发现的,包括上面的装饰模式,装饰者除了修改合同中定义的属性/方法之外,不会添加他们自己的属性/方法。例如,简单的咖啡制作示例中的Milk类 覆盖Coffee合约中定义的方法(getCost()和getIngredients())。如果Milk类想要添加自己的方法,例如GetBrand()或GetQuantity()(请注意,客户端可能需要将其接口转换为Milk类以访问这些方法)。虽然没有什么可以阻止你向装饰器添加字段/方法,但我的问题是,除了合同中约定的内容之外,将字段/方法添加到装饰器是一个好习惯吗?

我想到的一个解决方案是将一个属性字典(任何键值对)添加到契约中,每个装饰器都可以将自己的属性添加到此字典中。稍后,客户端可以使用其密钥访问属性。问题是对于大多数类,集合可能是空的。另外,我想

  milk.GetBrand() 

更具可读性
  milk.Properties.PropertybyName[cs_cost].

请分享您对此问题的看法..

感谢大家,

与Pradeep

1 个答案:

答案 0 :(得分:1)

  

装饰者模式的意图:将附加职责附加到   动态对象。装饰器提供了灵活的替代品   子类化以扩展功能。

因此装饰者的客户或未修饰的目标需要通过同一合同看到它们。因此,当您使用"装饰器模式"时,向装饰器添加更多方法不会带来任何好处。

术语"装饰者"然而,在非常一般意义上也使用(不是指Decorator模式)。所以,听到有人在谈论一个装饰器,它会在类中添加属性/方法来装饰目标,这是很常见的。但是,它不是装饰者模式。