1. 设计模式之装饰器模式:对目标类的功能进行增强
1.1. 介绍
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
动态地给一个对象添加额外的职责,同时不改变其结构。装饰器模式提供了一种灵活的替代继承方式来扩展功能。
装饰器模式 vs 代理模式
对比维度 | 装饰器模式(Decorator) | 代理模式(Proxy) |
---|---|---|
设计目的 | 动态扩展功能(增强原有行为)。 | 控制访问(保护或隐藏真实对象)。 |
关注点 | 添加新职责(如加糖、加密)。 | 管理对象生命周期(如延迟加载、权限校验)。 |
调用关系 | 装饰器和被装饰对象实现相同接口,客户端直接操作装饰器。 | 代理类和真实类实现相同接口,客户端通过代理间接访问真实对象。 |
对象创建时机 | 装饰器显式接收被装饰对象(外部传入)。 | 代理类内部创建或管理真实对象。 |
典型应用 | Java I/O流、GUI组件增强。 | 远程代理、虚拟代理、安全代理。 |
关键点 | 装饰器透明增强功能,客户端知道原类及增强类 | 代理 隐藏 真实对象,客户端通过代理间接操作 |
应用场景
动态扩展对象功能:如Java I/O流(
BufferedInputStream
、DataInputStream
等)。避免子类爆炸:替代多层继承(如咖啡加料、文件加密压缩)。
运行时添加或移除功能:如GUI组件的边框、滚动条等动态装饰。
优缺点及建议
优点
1.灵活扩展功能,无需修改原有代码。
2.符合开闭原则(OCP)。
3.组合优于继承,减少类爆炸。
缺点
1.多层装饰可能导致代码复杂(如`new A(new B(new C()))`)。
2.设计时需要区分核心功能和装饰功能。
使用建议
1.当需要在不增加大量子类的情况下扩展类的功能。
2.当需要动态地添加或撤销对象的功能。
注意事项
1.优先使用接口定义`Component`。
2.装饰器类命名以`Decorator`结尾(如`MilkDecorator`)。
3.避免过度装饰(一般不超过3层)。
1.2. 实现及相关代码
假设有一个业务,增强某组件的功能。
1.2.1. 相关代码
接口及数据对象
public interface Component {
void execute();
}
public static class ConcreteComponent implements Component {
public void execute() {
System.out.println("执行基础功能");
}
}
public static class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void execute() {
System.out.println("在执行基础功能之前,执行部分功能增强");
component.execute();
System.out.println("在执行基础功能之后,执行部分功能增强");
}
}
调用方法
public static void main(String[] args) {
Component decorator = new Decorator(new ConcreteComponent());
decorator.execute();
}