Java设计模式之装饰者模式
目录
Java设计模式之装饰者模式
装饰者模式(Decorator Pattern)是一种结构型设计模式,允许动态地向对象添加额外的职责。它通过将对象包装在装饰者类中,以提供比继承更灵活的扩展功能方式。
1. 核心角色
- 组件接口(Component) :定义被装饰对象和装饰者的共同接口。
- 具体组件(Concrete Component) :实现组件接口的基础对象。
- 装饰者抽象类(Decorator) :继承组件接口,并持有一个组件对象的引用。
- 具体装饰者(Concrete Decorator) :扩展装饰者抽象类,添加具体的装饰功能。
2. 应用场景
- 动态扩展对象功能 :在运行时添加或修改对象的行为。
- 替代多重继承 :避免因继承层次过深导致的类爆炸问题。
- 组合功能 :通过多个装饰者类灵活组合不同功能。
3. 代码示例:咖啡店订单系统
假设咖啡店销售多种饮料(如浓缩咖啡、黑咖啡),并允许添加多种调料(如牛奶、摩卡、糖)。
步骤1:定义组件接口(饮料)
步骤2:实现具体组件(基础饮料)
步骤3:定义装饰者抽象类
步骤4:实现具体装饰者(调料)
步骤5:客户端使用
输出结果
4. 装饰者模式优缺点
优点
- 灵活扩展 :动态添加功能,无需修改原有代码。
- 避免类爆炸 :通过组合替代多层继承。
- 符合开闭原则 :对扩展开放,对修改关闭。
缺点
- 复杂性增加 :系统中可能出现大量小装饰者类。
- 调试困难 :多层装饰可能导致对象链较长,不易追踪问题。
5. 装饰者模式 vs. 继承
特性 | 装饰者模式 | 继承 |
---|---|---|
扩展方式 | 动态组合(运行时) | 静态定义(编译时) |
灵活性 | 高(可任意组合装饰者) | 低(需预先定义子类) |
类数量 | 较多小类(每个功能一个装饰者) | 可能产生大量子类(组合爆炸) |
6. 实际应用场景
- Java I/O 流
:如
BufferedReader
装饰FileReader
。 - GUI 组件 :为窗口添加滚动条、边框等动态效果。
- Web 中间件 :为请求处理链添加日志、鉴权等功能。