作用: 可以在不改动原有代码的情况下,对现有的对象、行为进行新的层次的包装、装饰,增强原有的基本功能以提供更丰富的能力。
使用场景: 需要增强的目标存在抽象接口,且功能不足
结构图
使用
以墙面装修为例子
⏹1.定义一个墙面装修接口
public interface WallBeautify {
// 墙面装修就需要操作
void operation();
}
⏹2.接口的实现类
public class WallBeautifyClean implements WallBeautify {
@Override
public void operation() {
System.out.println("开始清理墙面");
}
}
⏹3.定义一个装饰器抽象类,对装修方法进行增强
装饰器也实现了基本的装修接口覆盖了原有的operation()方法,在此基础上进行增强
public abstract class WallBeautifyDecorator implements WallBeautify {
private WallBeautify wallBeautify;
// 传入WallBeautify接口的实现类
public WallBeautifyDecorator(WallBeautify wallBeautify) {
this.wallBeautify = wallBeautify;
}
// 覆盖原有的operation(方法,在此基础上进行增强)
@Override
public void operation() {
wallBeautify.operation();
decoration();
}
// 装饰器自定义的增强方法
public abstract void decoration();
}
⏹4.定义装饰器抽象类的各个实现类
public class WallBeautifyPutty extends WallBeautifyDecorator {
public WallBeautifyPutty(WallBeautify wallBeautify) {
super(wallBeautify);
}
@Override
public void decoration() {
System.out.println("开始刮腻子");
}
}
public class WallBeautifyPaint extends WallBeautifyDecorator {
public WallBeautifyPaint(WallBeautify wallBeautify) {
super(wallBeautify);
}
@Override
public void decoration() {
System.out.println("开始涂油漆");
}
}
public class WallBeautifyHang extends WallBeautifyDecorator {
public WallBeautifyHang(WallBeautify wallBeautify) {
super(wallBeautify);
}
@Override
public void decoration() {
System.out.println("开始挂壁画");
}
}
⏹5.增强
public class DecoratorTest {
public static void main(String[] args) {
// 清理墙面(未使用装饰器模式,功能单一,只能清理墙面)
WallBeautify wallBeautifyClean = new WallBeautifyClean();
wallBeautifyClean.operation();
System.out.println("--------------");
// 清理墙面 + 刮腻子
// 使用了WallBeautifyPutty类对WallBeautifyClean进行了增强,不仅能清理墙面还能刮腻子
WallBeautify wallBeautifyPutty = new WallBeautifyPutty(wallBeautifyClean);
wallBeautifyPutty.operation();
System.out.println("--------------");
// 清理墙面 + 刮腻子 + 涂油漆
// 使用WallBeautifyPaint类对WallBeautifyPutty进行了增强,不仅能清理墙面 + 刮腻子,还能涂油漆
WallBeautify wallBeautifyPaint = new WallBeautifyPaint(wallBeautifyPutty);
wallBeautifyPaint.operation();
System.out.println("--------------");
// 增加挂壁画功能
WallBeautify wallBeautifyHang = new WallBeautifyHang(wallBeautifyPaint);
wallBeautifyHang.operation();
System.out.println("--------------");
// 多层嵌套
WallBeautify wbh = new WallBeautifyHang(new WallBeautifyPaint(
new WallBeautifyPutty(new WallBeautifyClean())));
wbh.operation();
System.out.println("--------------");
}
}
// -----------------输出结果-----------------
参考资料:
1.https://www.cnblogs.com/V1haoge/p/10472321.html
2.https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247558483&idx=1&sn=66e3d98e22c029c7ca141debfadff253



