装饰者模式(Decorator Pattern)

定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

使用场景

需要透明且动态地扩展类的功能时。

UML类图

装饰者模式-w591

Component:抽象组件。

  • 它可以是一个接口或抽象类,充当的是被装饰的原始对象。

ConcreteComponent:组件具体实现类。

  • 它是Component的实现,也是要被装饰的具体对象。

Decorator:抽象装饰者。

  • 它的主要职责是装饰Component组件对象,其内部一定会有一个指向组件对象的引用。

  • 它为抽象类,开发者需要根据不同的装饰逻辑实现不同的具体子类。如下面的ConcreteDecoratorA、ConcreteDecoratorB。

ConcreteDecoratorA:装饰者具体实现类。

ConcreteDecoratorB:装饰者具体实现类。

装饰模式的常见实现

/** 抽象组件 */
public abstract class Component {
    
    public abstract void operate();
}
1
2
3
4
5
/** 组件具体实现类 */
public class ConcreteComponent extends Component {
    
    public void operate() {
        
    }
}
1
2
3
4
5
6
7
/** 抽象装饰者 */
public abstract class Decorator extends Component {
    private Component component;
    
    public Decorator(Component component) {
        this.component = component;
    }
    
    public void operate() {
        component.operate();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
/** 装饰者具体实现类 */
public class ConcreteDecoratorA {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    
    public void operate() {
        // 为原始对象的operate方法增加功能
        operateA();
        super.operate();
        operateB();
    }
    
    public void operateA() {
        
    }
    
    public void operateB() {
        
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Component component = new ConcreteComponent();
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
1
2
3

Android源码中的装饰模式

Android源码中的Context继承层次充分体现了装饰模式。

Context
├── ContextImpl
└── ContextWrapper
    ├── Application
    ├── ContextThemeWrapper
    │   └── Activity
    └── Service
1
2
3
4
5
6
7

Context是装饰模式中的抽象组件。它定义了大量的抽象方法。

ContextImpl是装饰模式中的组件具体实现类。它继承Context,并实现了Context的抽象方法。

ContextWrapper是装饰模式中的装饰者(带具体实现)。它继承Context,并有一个Context类型的成员变量,其指向ContextImpl组件对象。

Java源码中的装饰者模式

JDK中的IO类库设计就大量运用了装饰者模式。