1. 概述

本文聚焦Java中的结构型设计模式,探讨它们的本质及核心差异。这些模式是解决类与对象组合问题的利器,通过灵活运用对象组合和继承,构建强大的抽象层。

2. 结构型设计模式

根据GoF(四人帮)分类,设计模式分为三类:

  1. 创建型
  2. 结构型
  3. 行为型

简单来说,结构型模式处理类与对象的组合关系。它们提供不同方式,通过组合而非继承来构建复杂结构,避免类爆炸问题。

3. 代理模式

核心思想:创建一个中间层作为真实对象的替身,控制对原始资源的访问(如文件、网络连接)。这个替身隐藏了底层复杂性,提供简洁的接口。

详细实现可参考:Java代理模式详解

关键差异点: ✅ 代理与真实对象实现完全相同的接口,不修改原始数据
✅ 代理在编译时已知真实对象类型,而装饰器和适配器在运行时注入
❌ 与装饰器/适配器不同,代理不增强或改变原始对象行为

4. 装饰器模式

核心思想:动态给对象添加新功能,比继承更灵活。就像给手机贴膜+戴壳,层层增强功能。

详细实现可参考:Java装饰器模式实战

关键差异点: ⚠️ 虽然与代理结构相似,但目的不同:代理侧重访问控制,装饰器侧重功能增强
✅ 装饰器可无限递归嵌套(如IO流中的BufferedReader+InputStreamReader)
✅ 与代理/适配器一样,持有原始对象引用

5. 适配器模式

核心思想:让两个不兼容的接口协同工作。就像用转接头让Type-C耳机插在3.5mm接口上。

详细实现可参考:Java适配器模式指南

与代理的核心差异: ❌ 适配器提供不同接口,代理提供相同接口
⚠️ 适配器用于设计后的兼容(如整合第三方库),桥接模式用于设计前的解耦

6. 桥接模式

核心思想:将抽象部分与实现部分分离,使它们都能独立变化。就像遥控器(抽象)和电视品牌(实现)解耦。

详细实现可参考:Java桥接模式深度解析

关键差异点: ✅ 仅适用于设计阶段(与适配器相反)
✅ 抽象和实现可独立扩展(如新增遥控器功能不影响电视品牌)
❌ 适配器解决已有问题,桥接预防未来扩展问题

7. 总结

本文梳理了四种核心结构型模式的本质差异:

  • 代理:控制访问,不改变行为
  • 装饰器:动态增强,可无限嵌套
  • 适配器:接口转换,事后补救
  • 桥接:抽象解耦,事前设计

完整实现代码见:GitHub仓库


原始标题:Proxy, Decorator, Adapter and Bridge Patterns | Baeldung