装饰者模式通过多态实现动态功能扩展:装饰器与目标类实现同一接口,抽象装饰器持接口引用并委托调用,具体装饰器在委托前后添加逻辑,客户端仅依赖接口组装调用链。

Java 中利用多态实现装饰者模式,核心是让装饰器类和被装饰的目标类实现同一个接口(或继承同一抽象类),从而在运行时动态组合、透明扩展功能,而调用方无需感知具体是原始对象还是被层层包装的装饰器。
统一接口:定义行为契约
先定义一个公共接口(如 Component),声明所有组件共有的操作方法(如 operation())。目标类(ConcreteComponent)和所有装饰器(Decorator 及其子类)都实现该接口。这是多态的基础——编译期只认接口,运行期才决定执行哪个实例的方法。
例如:
interface Component {
void operation();
}
class ConcreteComponent implements Component {
public void operation() { System.out.println("基础功能"); }
}
抽象装饰器:持有并委托给被装饰对象
创建一个抽象装饰器类(如 Decorator),也实现 Component 接口,并持有一个 Component 类型的引用(构造器注入)。它默认把所有方法调用委托给内部组件——这保证了“不改变原有行为”的前提。
关键点:这个引用类型是接口,不是具体类,才能接受任意 Component 实现类(包括其他装饰器),形成链式结构。
示例:
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
component.operation(); // 委托,多态在此生效
}
}
具体装饰器:在委托前后添加新行为
每个具体装饰器(如 LoggingDecorator、TimingDecorator)继承 Decorator,重写所需方法,在调用 super.operation()(即委托)前后插入自定义逻辑。
由于多态,当调用链中某个装饰器的 operation() 时,它内部的 component.operation() 可能触发另一个装饰器的方法,最终落到原始对象——整个过程对客户端完全透明。
例如:
class LoggingDecorator extends Decorator {
public LoggingDecorator(Component c) { super(c); }
public void operation() {
System.out.print("[日志] 开始: ");
super.operation(); // 多态调用,可能进入 TimingDecorator 或 ConcreteComponent
System.out.println(" [日志] 结束");
}
}
运行时组装:依赖接口,不依赖实现
客户端代码只面向 Component 接口编程。通过嵌套构造器,可自由组合装饰逻辑:
- Component c = new ConcreteComponent();
- c = new LoggingDecorator(c);
- c = new TimingDecorator(c);
- c.operation(); // 输出日志 + 计时 + 基础功能
每次赋值后,变量 c 的静态类型仍是 Component,但实际类型不断变化——这正是多态支撑装饰者模式灵活性的关键所在。不需要修改原有类,也不需要大量子类爆炸,就能按需叠加职责。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











