定义
装饰模式(别名:包装器)
动态地给对象添加一些额外的职责。就功能来说,装饰模式相比生成子类更为灵活。
Decorator Pattern(Another Name: Wrapper)
Attach additional responsibilities to an object dynamically. Decorator provide a flexible alternative to >subclassing for extending functionally.
角色
- 抽象组件(Component):一个抽象类,定义了被装饰者需要进行装饰的方法
- 具体组件(Concrete Component):抽象组件的一个子类,被装饰者
- 装饰(Decorator):也是抽象组件的一个子类,但装饰还包含一个抽象组件声明的变量以保存被装饰者的引用。
- 具体装饰(Concrete Decorator):装饰者,是装饰的一个非抽象子类。
装饰模式UML图
装饰模式代码示例
详见Gitee仓库Java设计模式的decoratorpattern包
git clone https://gitee.com/wang-zehan2003/java-design-patterns.git
为什么要定义抽象组件?
使装饰对象在一些情况下也可以成为被装饰对象进行多次装饰。同时可以让被装饰者和装饰者是松耦合关系。
Java IO和装饰模式
代码示例
public void readToBuffer(StringBuffer buffer, InputStream is) {
// ......代码省略
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
line = reader.readLine();
// ......代码省略
}
这段代码示例示范了InputStream
和InputStreamReader
都没有readLine()
方法的情况下,如何通过二次装饰得到BufferedReader
的readLine()
方法。
装饰模式的优点
- 装饰者和被装饰者是松耦合关系。
- 满足开闭原则。
- 可以使用多个具体装饰来装饰具体组件的实例。