装饰者,什么是装饰者?它就是继承抽象对象,然后再组合这个抽象对象(既有IsA关系,又有HasA关系),此时,在装饰着里添加想要增加的行为,同时要实现具体的A的行为,这样就增加了新的功能。
在构造装饰者时,初始化抽象对象。
装饰着模式实现了在运行时动态扩展对象功能的能力,不需要单独使用继承来扩展功能,不会产生子类膨胀的问题。装饰者在外部扩展对象的功能,装饰者要知道这些待扩展的对象,而待扩展的对象是不知道这些装饰者的,在运行时却可以使用这些功能。对象被装饰(扩展)后,仍然还是原来的对象(具有IsA的关系).
这就像墙不需要知道粉刷它的油漆,但是油漆必须知道要刷哪些(面)墙.在墙刷完了漆以后,它还是墙(IsA)的关系.
装饰着是比较容易理解的设计模式之一,我觉得重点在于装饰者和待扩展对象之间同时具有IsA和HasA这两种关系,并且在使用时,经过装饰的对象仍然是原来的对象,仍然具有原来对象的特征,因为,装饰者仅仅是增加了功能而以。
李建忠老师说,装饰者模式的要点在于解决"主体类在多个方向上的扩展问题",我觉得说的非常的贴切。
和以往一样,我还想说一下装饰者模式和适配器模式的区别与联系。刚开始学适配器的时候,总觉得适配器可以应用的增加新功能的场合,应为适配器里面有HasA的关系。却不知道适配器,从它的名字都可以看出来,是为了适应某种行为。也就是让本来不能使用的东西通过某种转换可以使用,适配嘛。它的关键在于一种转换,而装饰者,还是从名字看,装饰嘛,是增加。适配是复用现存的类,使它的接口与新的环境要求相一致。装饰者是为现存的对象动态的增加新功能,重点解决动态的问题(子类膨胀的问题)。
外观模式注重简化接口,在引用时不必关心内部实现,只需要关心外部接口就可以了。其实就是把一些相关的类(注意:是相关的类)揉在一起以方便访问。
综合比较外观模式,适配器模式,桥接模式,装饰者模式,我们可以看到,外观模式关注的是接口简化问题,使访问变得简单;适配器模式使本来不合适的接口变得合适,是一种接口转换;桥接模式把两个变化的维度接成一个,把辅逻辑揉进主逻辑,同时进行抽象,让变化分离出来,使变化不会影响稳定的部分,关注的是抽象与实现的分离;装饰者模式关注为对象增加新功能。
设计模式很伟大,我们应该学习它,本章结束,谢谢大家。呵呵:)
插句题外的话。我认为,理解设计模式重点不在于类图怎么画,代码怎么写。诚然,代码能很直观的表示出一种设计模式的意图和使用方法,然后同时也局限了我们对思想的理解。一个设计模式最重要的东西还在于思想,当我们理解了这个设计模式能干什么,能解决什么问题,什么场景可以应用,我想,理解那张图应该不是很难吧。一句很老很老很土很土的话,设计模式好学,却不好用。所以,我觉得大家应该更多的关注一种设计模式的思想,更多的关注它能解决的问题,更多的关注它可以用在什么场景下。
另外,把各种设计模式进行比较是我的习惯,我觉得这样可以温故而知新,使新知识和旧知识结合起来,比较区别和联系,以便更深入的理解。经常重复比较,印象会深刻些。