1. 概述
本文聚焦Java中的结构型设计模式,探讨它们的本质及核心差异。这些模式是解决类与对象组合问题的利器,通过灵活运用对象组合和继承,构建强大的抽象层。
2. 结构型设计模式
根据GoF(四人帮)分类,设计模式分为三类:
- 创建型
- 结构型
- 行为型
简单来说,结构型模式处理类与对象的组合关系。它们提供不同方式,通过组合而非继承来构建复杂结构,避免类爆炸问题。
3. 代理模式
核心思想:创建一个中间层作为真实对象的替身,控制对原始资源的访问(如文件、网络连接)。这个替身隐藏了底层复杂性,提供简洁的接口。
详细实现可参考:Java代理模式详解
关键差异点:
✅ 代理与真实对象实现完全相同的接口,不修改原始数据
✅ 代理在编译时已知真实对象类型,而装饰器和适配器在运行时注入
❌ 与装饰器/适配器不同,代理不增强或改变原始对象行为
4. 装饰器模式
核心思想:动态给对象添加新功能,比继承更灵活。就像给手机贴膜+戴壳,层层增强功能。
详细实现可参考:Java装饰器模式实战
关键差异点:
⚠️ 虽然与代理结构相似,但目的不同:代理侧重访问控制,装饰器侧重功能增强
✅ 装饰器可无限递归嵌套(如IO流中的BufferedReader+InputStreamReader)
✅ 与代理/适配器一样,持有原始对象引用
5. 适配器模式
核心思想:让两个不兼容的接口协同工作。就像用转接头让Type-C耳机插在3.5mm接口上。
详细实现可参考:Java适配器模式指南
与代理的核心差异:
❌ 适配器提供不同接口,代理提供相同接口
⚠️ 适配器用于设计后的兼容(如整合第三方库),桥接模式用于设计前的解耦
6. 桥接模式
核心思想:将抽象部分与实现部分分离,使它们都能独立变化。就像遥控器(抽象)和电视品牌(实现)解耦。
详细实现可参考:Java桥接模式深度解析
关键差异点:
✅ 仅适用于设计阶段(与适配器相反)
✅ 抽象和实现可独立扩展(如新增遥控器功能不影响电视品牌)
❌ 适配器解决已有问题,桥接预防未来扩展问题
7. 总结
本文梳理了四种核心结构型模式的本质差异:
- 代理:控制访问,不改变行为
- 装饰器:动态增强,可无限嵌套
- 适配器:接口转换,事后补救
- 桥接:抽象解耦,事前设计
完整实现代码见:GitHub仓库