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
差异可能更多的是目的而不是实现.在某些情况下,复合模式优于子类化.例如,您可以通过向其添加其他类的实例来添加您希望类具有的功能,然后通过转发接口公开该功能.
装饰器允许您透明地向类添加功能(通常是单个功能),而不需要类的实例的客户端需要知道那里有装饰器 - 例如,Django中的视图上的"login_required"装饰器引发异常如果用户未登录,则视图的行为与没有装饰器的情况相同.
在这两种情况下,你有一个对象嵌入另一个对象,但你想要完成的事情可以说是不同的.