【问题标题】:Extending decorators扩展装饰器
【发布时间】: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#..

标签: design-patterns decorator


【解决方案1】:

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

因此,装饰者或未装饰目标的客户需要通过同一个合同来查看他们两者。因此,当您使用“装饰器模式”时,向装饰器添加更多方法不会提供任何优势。

然而,术语“装饰器”也用于非常笼统的意义(不是指装饰器模式)。所以你经常听到有人谈论一个装饰器,它向一个类添加属性/方法来装饰一个目标。但是,它不是装饰器模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2020-06-26
    • 2016-07-18
    • 2013-02-19
    • 2017-03-06
    • 2020-08-20
    • 2017-11-19
    相关资源
    最近更新 更多