复合图案和装饰图案之间的区别?

cod*_*der 47 design-patterns composite decorator

Composite Pattern和Decorator Pattern有什么区别?

小智 44

复合图案和装饰器的结构看起来相同,但它们有不同的意图.

Composite为叶子和复合提供了统一的接口.

装饰器装饰器为叶子提供了额外的功能,同时给出了统一的界面.


例子

复合模式:经典的Windows文件夹和文件.Windows文件夹是复合材料.文件是叶子.双击其中任何一个打开文件/文件夹 - 双击是统一界面.

装饰者模式:缓冲io - java.io.FileWriter并且java.io.BufferedWriter都延伸java.io.Writer.java.io.BufferedWriter是复合的,FileWriter是叶子.BufferedWriter增加额外的缓冲责任(或功能)FileWriter. write()方法是统一接口,而缓冲是附加功能.


Phi*_*ght 43

他们通常会手拉手.因为使用复合图案经常导致也使用装饰图案.

复合模式允许您以允许外部代码将整个结构作为单个实体查看的方式构建分层结构(例如元素树).因此,叶实体的接口与复合实体的实体完全相同.因此,本质上是复合结构中的所有元素都具有相同的接口,即使有些是叶节点而其他元素是整个结构.用户界面通常使用此方法来实现轻松的可组合性.

http://en.wikipedia.org/wiki/Composite_pattern

装饰器模式允许实体完全包含另一个实体,以便使用装饰器看起来与包含的实体相同.这允许装饰器修改其封装的任何内容的行为和/或内容,而不改变实体的外观.例如,您可以使用装饰器在包含元素的使用上添加日志记录输出,而不更改包含元素的任何行为.

http://en.wikipedia.org/wiki/Decorator_pattern

  • 对我来说,这个答案中最有趣的是你写的('他们通常是齐头并进.在使用复合图案时经常导致也使用装饰器模式')在gof书中你可以看到Composite和Decorator之间的依赖关系.Composite可以使用Decorator为对象添加职责(它在图上具有模式之间的依赖关系).你能为它提供一个实现的例子(或类图).因为我不确定gof的作者究竟是什么. (6认同)

Ari*_*iel 17

可以将装饰器视为仅具有一个组件的简并复合.但是,装饰器增加了额外的职责 - 它不适用于对象聚合.

这就是四人帮中的"设计模式 - 可重用面向对象软件的元素"中所说的.


Eri*_*ker 5

差异可能更多的是目的而不是实现.在某些情况下,复合模式优于子类化.例如,您可以通过向其添加其他类的实例来添加您希望类具有的功能,然后通过转发接口公开该功能.

装饰器允许您透明地向类添加功能(通常是单个功能),而不需要类的实例的客户端需要知道那里有装饰器 - 例如,Django中的视图上的"login_required"装饰器引发异常如果用户未登录,则视图的行为与没有装饰器的情况相同.

在这两种情况下,你有一个对象嵌入另一个对象,但你想要完成的事情可以说是不同的.