1. 装饰器模式(Decorator Pattern
1.1 基本概念
- 装饰器模式也叫作包装器模式(Wrapper Pattern),指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责
- 核心是在不改变原有类的基础上给类新增功能(类比俄罗斯套娃)
- 可以随机组合
- 例如,通过服饰组合出一个有个性的人完全可以有无数种方案,并非固定的
1.2 四个角色
- 抽象组件(Component)是一个接口或者抽象类,定义装饰对象的行为
- 具体组件(ConcreteComponent),被装饰者
- 抽象装饰器(Decorator),持有被装饰器的引用
- 具体装饰器(ConcreteDecorator)

1.3 适用场景
- 扩展一个类的功能
- 动态添加功能,动态撤销
- 把对象传进去,随机组合
2. 示例
2.1 装饰模式
public abstract class AbstractComponent {
protected abstract void operation();
}
// 具体组件
public class ConcreteComponent extends AbstractComponent {
@Override
protected void operation() {
System.out.println("ConcreteComponent: do something...");
}
}
// 装饰器
public abstract class AbstractDecorator extends AbstractComponent {
// 组件
protected AbstractComponent component;
public AbstractDecorator(AbstractComponent component) {
this.component = component;
}
@Override
protected void operation() {
if (component != null) {
component.operation();
}
}
}
public class ConcreteDecoratorA extends AbstractDecorator {
public ConcreteDecoratorA(AbstractComponent component) {
super(component);
}
@Override
protected void operation() {
System.out.println("Concrete decorator A: First");
super.operation();
System.out.println("Concrete decorator A: End");
}
}
public class ConcreteDecoratorB extends AbstractDecorator {
public ConcreteDecoratorB(AbstractComponent component) {
super(component);
}
@Override
protected void operation() {
System.out.println("Concrete decorator B: First");
super.operation();
System.out.println("Concrete decorator B: End");
}
}
@Test
public void test() {
ConcreteComponent component = new ConcreteComponent();
AbstractDecorator decoratorA = new ConcreteDecoratorA(component);
decoratorA.operation();
AbstractDecorator decoratorB = new ConcreteDecoratorB(component);
decoratorB.operation();
}
打印结果
Concrete decorator A: First
ConcreteComponent: do something...
Concrete decorator A: End
Concrete decorator B: First
ConcreteComponent: do something...
Concrete decorator B: End
2.2 装饰器装饰具体的装饰对象
@Test
public void test2() {
ConcreteComponent component = new ConcreteComponent();
AbstractDecorator decoratorA = new ConcreteDecoratorA(component);
AbstractDecorator decoratorB = new ConcreteDecoratorB(decoratorA);
decoratorB.operation();
}
打印结果
Concrete decorator B: First
Concrete decorator A: First
ConcreteComponent: do something...
Concrete decorator A: End
Concrete decorator B: End
3. 应用
3.1 Stream IO 流
- 抽象组件:InputStream
- 被装饰者:FileInputStream, ByteArrayInputStream
- 装饰者组件:FilterInputSteam
- 具体装饰:BufferedInputStream, DataInputStream
- 示例:添加 Buffer 缓冲功能
InputStream is = new BufferedInputStream(new FileInputStream("path"));

网友评论