我指的是关于装饰模式的维基百科文章,我发现coffee making example非常有用。我在装饰模式的大多数例子中发现的,包括上面的装饰模式,装饰者除了修改合同中定义的属性/方法之外,不会添加他们自己的属性/方法。例如,简单的咖啡制作示例中的Milk类 覆盖Coffee合约中定义的方法(getCost()和getIngredients())。如果Milk类想要添加自己的方法,例如GetBrand()或GetQuantity()(请注意,客户端可能需要将其接口转换为Milk类以访问这些方法)。虽然没有什么可以阻止你向装饰器添加字段/方法,但我的问题是,除了合同中约定的内容之外,将字段/方法添加到装饰器是一个好习惯吗?
我想到的一个解决方案是将一个属性字典(任何键值对)添加到契约中,每个装饰器都可以将自己的属性添加到此字典中。稍后,客户端可以使用其密钥访问属性。问题是对于大多数类,集合可能是空的。另外,我想
milk.GetBrand()
比
更具可读性 milk.Properties.PropertybyName[cs_cost].
请分享您对此问题的看法..
感谢大家,
与Pradeep
答案 0 :(得分:1)
装饰者模式的意图:将附加职责附加到 动态对象。装饰器提供了灵活的替代品 子类化以扩展功能。
因此装饰者的客户或未修饰的目标需要通过同一合同看到它们。因此,当您使用"装饰器模式"时,向装饰器添加更多方法不会带来任何好处。
术语"装饰者"然而,在非常一般意义上也使用(不是指Decorator模式)。所以,听到有人在谈论一个装饰器,它会在类中添加属性/方法来装饰目标,这是很常见的。但是,它不是装饰者模式。