装饰模式,也称为包装模式,结构型设计模式之一
定义
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活
使用场景
需要透明且动态的扩展类的功能时
简单实现
抽象组件类:
1
2
3
4
5
6
|
package DecorationMode;
//抽象组件类
public abstract class Component {
public abstract void operate();
}
|
组件具体实现类:
1
2
3
4
5
6
7
8
|
package DecorationMode;
//组件具体实现类
public class ConcreteComponent extends Component {
public void operate() {
System.out.println("具体逻辑执行内容");
}
}
|
抽象装饰者:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package DecorationMode;
//抽象装饰者
public class Decorator extends Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void operate() {
component.operate();
}
}
|
装饰者具体实现类A:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package DecorationMode;
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
operateA();
super.operate();
}
public void operateA(){
//装饰方法逻辑
System.out.println("装饰方法罗技");
}
}
|
装饰者具体实现类B:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package DecorationMode;
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operate() {
opearteB();
super.operate();
}
public void opearteB(){
System.out.println("自定义的装饰方法B");
}
}
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package DecorationMode;
//程序测试类
public class Client {
public static void main(String[] args) {
//构造被装饰的组件对象
Component component=new ConcreteComponent();
//根据组件对象构造装饰者对象A并调用 此时相当于给组件对象增加装饰者A的功能方法
Decorator decorator=new ConcreteDecoratorA(component);
decorator.operate();
Decorator decorator1=new ConcreteDecoratorB(component);
decorator1.operate();
}
}
|
输出结果:

总结
装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案