装饰器模式
# 定义
装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。‘
# 结构
装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰器模式可以在不是用创造更多子类的情况下,将对象的功能加以拓展
**抽象构件(Component)角色:**给出一个抽象接口,已规范准备接收附加责任的对象。
**具体构件(ConcreteComponent)角色:**定义一个将要接收附加责任的类
**装饰(Decorator)角色:**持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
**具体装饰(ConcreteDecorator)角色:**负责给构件对象“贴上”附加的责任。
# 代码
抽象构件角色
public interface Component {
public void sampleOpreation();
}
1
2
3
2
3
具体构件角色:
public class ConcreteComponent implements Component {
@Override
public void sampleOpreation() {
// TODO 完成相关的业务代码
}
}
1
2
3
4
5
6
2
3
4
5
6
装饰角色
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void sampleOpreation() {
//委派给构件
component.sampleOpreation();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
具体装饰角色
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 完成相关的业务代码
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 完成相关的业务代码
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 装饰模式的优点
- 装饰模式与继承关系的目的都是要拓展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者“除掉”一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
- 通过不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出更多不同行为的组合。
# 装饰模式的缺点
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另外一方面,使用装饰模式会产生比使用继承关系所产生的更多的对象。而更多的对象会使得查找错误更为困难,特别是这些对象在看上去极为相似的时候。
编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19