引:想给某些类增加一些功能,有些人可能会想到直接修改类,但是要求不影响子类,这就需要用到装饰模式了。
定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。——结构类
装饰模式和代理模式很像,它的通用类图如下:
下面简单说说类图中的4个对象:
- Component是一个接口或者抽象类,就是定义我们最核心的对象,也是最原始的对象。
- ConcreteComponent是最核心的对象的实现,我们要装饰的就是它。
- Decorator装饰对象,它里面不一定有抽象的方法,但是它的属性里必然有一个private变量指向Component。
- ConcreteDecorator是装饰对象的实现类。
装饰模式的具体实现代码如下: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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72public abstract class Component {
// 抽象的方法
public abstract void operate();
}
public class ConcreteComponent exgtends Component {
// 具体实现
public void operate() {
System.out.println("do something");
}
}
// 抽象装饰类,如果只有一个装饰类,则可以没有抽象装饰者
public abstract class Decorator extends Component {
private Component component = null;
// 通过构造函数传递被修饰者
public Decorator(Component _component) {
this.component = _component;
}
// 委托给被修饰者执行
public void operate() {
this.component.operate();
}
}
// 具体装饰类
public class ConcreteDecorator1 extends Decorator {
// 定义被修饰者
public ConcreteDecorator1(Component _component) {
super(_component);
}
// 定义自己的修饰方法
private void method1() {
System.out.println("method1 修饰");
}
// 重写父类的operate方法
public void operate() {
this.method1();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator {
// 定义被修饰者
public ConcreteDecorator2(Component _component) {
super(_component);
}
// 定义自己的修饰方法
private void method2() {
System.out.println("method2 修饰");
}
// 重写父类的operate方法
public void operate() {
this.method2();
super.operate();
}
}
// 场景类
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修饰
component = new ConcreteDecorator1(component);
// 第二次修饰
component = new ConcreteDecorator2(component);
// 修饰后运行
component.operate();
}
}
应用
优点
- 装饰类和被修饰类可以独立发展,而不会相互耦合。
- 装饰模式是继承关系的一个替代方案。
- 装饰模式可以动态地扩展一个实现类的功能。
缺点
多层的装饰是比较复杂的。
使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销的。
- 需要为一批兄弟类进行改装或加装功能。
最佳实践
- 装饰模式是对继承的有力补充。
- 在业务变更的时候,增强类的功能。
参考
- 《设计模式之禅》