Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 扩展装饰器_Design Patterns_Decorator - Fatal编程技术网

Design patterns 扩展装饰器

Design patterns 扩展装饰器,design-patterns,decorator,Design Patterns,Decorator,我指的是维基百科上关于装饰模式的文章,我发现它非常有用。我在大多数decorator模式示例(包括上面的示例)中发现,decorator不添加自己的属性/方法,只修改合同中定义的属性/方法。例如,咖啡制作示例中的牛奶类 重写咖啡合同中定义的方法(getCost()和GetComponents())。如果Milk类想要添加自己的方法,例如GetBrand()或GetQuantity()(请注意,客户端可能需要将其接口转换为Milk类才能访问这些方法)。虽然没有什么可以阻止您向decorator添加

我指的是维基百科上关于装饰模式的文章,我发现它非常有用。我在大多数decorator模式示例(包括上面的示例)中发现,decorator不添加自己的属性/方法,只修改合同中定义的属性/方法。例如,咖啡制作示例中的牛奶类 重写咖啡合同中定义的方法(getCost()和GetComponents())。如果Milk类想要添加自己的方法,例如GetBrand()或GetQuantity()(请注意,客户端可能需要将其接口转换为Milk类才能访问这些方法)。虽然没有什么可以阻止您向decorator添加字段/方法,但我的问题是,除了合同中约定的内容之外,向decorator添加字段/方法是否是一种良好的做法

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

  milk.GetBrand() 
它的可读性比

  milk.Properties.PropertybyName[cs_cost].
请分享你对这个问题的看法

谢谢大家,

普拉迪普

装饰者模式的意图:将额外的责任附加到 动态地创建对象。装饰师提供了一个灵活的替代方案 用于扩展功能的子类化

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


然而,术语“decorator”也在非常一般的意义上使用(不是指decorator模式)。因此,您经常听到有人谈论一个装饰器,该装饰器向类添加属性/方法来装饰目标。但是,这不是装饰器模式。

装饰器模式的“解决方案”可能是非常特定于语言的,因为不同的语言使实现此模式变得容易或困难。你在寻找一种特定语言的解决方案吗?不是真的……不过我用的是C。。