装饰器模式

定义

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

装饰器模式通用类图

实现

Component

Component 是一个接口或者抽象类,定义需要被装饰的原始类。

1
2
3
public abstract class Component{
public abstract void operate();
}

Concrete Component

Component 的实现类。

1
2
3
4
5
6
7
8
public class ConcreteComponent extends Component{

@Override
public void operate(){
//....
}

}

Decorator

抽象类,用于实现接口或者抽象方法。包含被修饰的Componnet属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Decorator extends Component{

private Component component = null;

public Decorator(Component c){
this.component = c;
}
@Override
public void operate(){
this.component.operate();
}

}

Concrete Decorator

具体装饰角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component){
super(component);
}
private void method1(){
//....
}
public void operate(){
this.method1();
super.operate();
}
}


public class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component){
super(component);
}
private void method2(){
//....
}
public void operate(){
super.operate();
this.method2();
}
}

Use

1
2
3
4
Component c = new ConcreteComponent();
c = new ConcreteDecorator1(c);
c = new ConcreteDecorator2(c);
c.operate();

应用

优点

装饰类和被装饰类可以独立发展,而不会相互耦合。
装饰模式是继承关系的一个替代方案。
装饰模式可以动态地扩展一个实现类的功能。

缺点

当装饰多层时导致系统复杂度高。