目录

Java设计模式之装饰者模式

Java设计模式之装饰者模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,允许动态地向对象添加额外的职责。它通过将对象包装在装饰者类中,以提供比继承更灵活的扩展功能方式。

1. 核心角色

  • 组件接口(Component) :定义被装饰对象和装饰者的共同接口。
  • 具体组件(Concrete Component) :实现组件接口的基础对象。
  • 装饰者抽象类(Decorator) :继承组件接口,并持有一个组件对象的引用。
  • 具体装饰者(Concrete Decorator) :扩展装饰者抽象类,添加具体的装饰功能。

2. 应用场景

  • 动态扩展对象功能 :在运行时添加或修改对象的行为。
  • 替代多重继承 :避免因继承层次过深导致的类爆炸问题。
  • 组合功能 :通过多个装饰者类灵活组合不同功能。

3. 代码示例:咖啡店订单系统

假设咖啡店销售多种饮料(如浓缩咖啡、黑咖啡),并允许添加多种调料(如牛奶、摩卡、糖)。

步骤1:定义组件接口(饮料) https://i-blog.csdnimg.cn/direct/288b7028c85544959ce85e71a11a9d9b.png

步骤2:实现具体组件(基础饮料) https://i-blog.csdnimg.cn/direct/ec36b8e1f9b44e34b6c8653c2e69b8c9.png

步骤3:定义装饰者抽象类 https://i-blog.csdnimg.cn/direct/ab10cd05f72a450991f071a0f7937be8.png

步骤4:实现具体装饰者(调料) https://i-blog.csdnimg.cn/direct/3df51471874c4c7db921be2279e96fe1.png https://i-blog.csdnimg.cn/direct/e367725be5e64afaaea37e2287785a0f.png https://i-blog.csdnimg.cn/direct/c47b7fd2d87540f7b7807f297b39a1c9.png

步骤5:客户端使用 https://i-blog.csdnimg.cn/direct/4b723970012f4496a6f4b9b77dc729f3.png

输出结果

4. 装饰者模式优缺点

优点
  • 灵活扩展 :动态添加功能,无需修改原有代码。
  • 避免类爆炸 :通过组合替代多层继承。
  • 符合开闭原则 :对扩展开放,对修改关闭。
缺点
  • 复杂性增加 :系统中可能出现大量小装饰者类。
  • 调试困难 :多层装饰可能导致对象链较长,不易追踪问题。

5. 装饰者模式 vs. 继承

特性装饰者模式继承
扩展方式动态组合(运行时)静态定义(编译时)
灵活性高(可任意组合装饰者)低(需预先定义子类)
类数量较多小类(每个功能一个装饰者)可能产生大量子类(组合爆炸)

6. 实际应用场景

  • Java I/O 流 :如 BufferedReader 装饰 FileReader
  • GUI 组件 :为窗口添加滚动条、边框等动态效果。
  • Web 中间件 :为请求处理链添加日志、鉴权等功能。