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 中间件:为请求处理链添加日志、鉴权等功能。