装饰器模式详解:动态扩展对象功能
掌握设计模式能显著提升系统架构能力,通过标准化解决方案应对复杂场景。装饰器模式作为GoF提出的经典结构型模式,通过组合方式实现功能扩展,在保持原有行为基础上动态增加新职责。
核心特征:
- 通过组合而非继承实现功能增强
- 保持被装饰对象原有接口不变
- 支持多层嵌套装饰
应用场景:
1. 需要动态添加职责的场景
2. 不希望修改原有类的封闭系统
3. 实现类似AOP的横切关注点管理
实现示例:
以智能设备功能扩展为例,展示如何通过装饰器模式实现功能叠加:
// 基础设备接口
public interface Device {
void operate();
}
// 基础设备实现
public class BasicDevice implements Device {
@Override
public void operate() {
System.out.println("基础功能:");
System.out.println("通话");
System.out.println("短信");
}
}
// 功能扩展装饰器
public interface DeviceDecorator extends Device {
void enhance();
}
// 智能设备装饰器
public class SmartDevice implements DeviceDecorator {
private Device device;
public SmartDevice(Device device) {
this.device = device;
}
@Override
public void operate() {
device.operate();
}
@Override
public void enhance() {
device.operate();
System.out.println("智能增强功能:");
System.out.println("摄像");
System.out.println("NFC");
}
}
// 特色设备装饰器
public class FeatureDevice implements DeviceDecorator {
private Device device;
public FeatureDevice(Device device) {
this.device = device;
}
@Override
public void operate() {
device.operate();
}
@Override
public void enhance() {
device.operate();
System.out.println("特色功能:");
System.out.println("摄像");
System.out.println("NFC");
System.out.println("红外控制");
}
}
测试验证:
public class Test {
public static void main(String[] args) {
System.out.println("===智能设备测试===");
new SmartDevice(new BasicDevice()).enhance();
System.out.println("===特色设备测试===");
new FeatureDevice(new BasicDevice()).enhance();
}
}
运行结果:
===智能设备测试===
基础功能:
通话
短信
智能增强功能:
摄像
NFC
===特色设备测试===
基础功能:
通话
短信
特色功能:
摄像
NFC
红外控制
模式分类:
根据装饰器是否添加新功能可分为:
- 透明装饰模式:仅重写原有方法,如Java I/O中的BufferedInputStream
- 半透明装饰模式:新增功能方法,如DataInputStream的readInt()方法
优势分析:
- 避免类爆炸问题
- 支持运行时动态组合
- 保持开放封闭原则
- 提升代码可维护性
注意事项:
- 装饰器层级不宜过深
- 需保持接口一致性
- 注意方法调用顺序