装饰者模式

动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。

其中具体涉及的角色有:

(1)抽象组件:定义一个抽象接口,来规范准备附加功能的类
(2)具体组件:将要被附加功能的类,实现抽象构件角色接口
(3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口
(4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。

其典型的应用场景是java io中的缓冲流,如BufferedWriter,BufferedReader...,它们在Writer,Reader的逻辑基础上进行了扩展。

比如下面是OutputStreamWriter(Writer的具体实现类)的write方法

装饰者模式

对比BufferedWriter的write方法,它在OutputStreamWriter的write方法基础上扩展了诸多功能(同步锁,流关闭检验,缓存)

装饰者模式

装饰者模式

装饰者模式

 

下面单独举例说明:

场景:程序员经常使用编辑器来编写代码,编辑器有文本编辑器,也有IDE,IDE明显更加强大了。

装饰者模式

装饰者模式

装饰者模式

测试代码(可见装饰类在原有被装饰类基础上扩展了一些特有功能):

装饰者模式

 

其实继承也可以实现类似装饰效果,但是如果被装饰类被final修饰,无法实现extends情况下,装饰者模式就派上用场了。