结构性设计模式(Structural Design Patterns)是面向对象设计模式中的一类
📅 2026/7/22 0:34:25
👁️ 阅读次数
📝 编程学习
结构性设计模式(Structural Design Patterns)是面向对象设计模式中的一类,主要用于处理类或对象的组合关系,以简化系统结构、提高代码复用性与灵活性。它们关注如何将类和对象组合成更大的结构,同时保持系统的松耦合与可扩展性。常见的结构性设计模式包括:
- 适配器模式(Adapter):使不兼容的接口能够协同工作,常用于系统集成或遗留系统改造。
- 装饰器模式(Decorator):动态地为对象添加职责,避免子类爆炸,符合开闭原则。
- 代理模式(Proxy):为其他对象提供一个代理以控制对原对象的访问(如远程代理、虚拟代理、保护代理)。
- 外观模式(Facade):为复杂子系统提供统一、简化的接口,降低客户端与子系统之间的耦合。
- 桥接模式(Bridge):将抽象与实现分离,使二者可以独立变化,适用于多维度变化的系统。
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”层次关系,让客户端统一处理单个对象和组合对象。
- 享元模式(Flyweight):通过共享技术有效支持大量细粒度对象,节省内存(适用于对象数量庞大且状态可外部化场景)。
这些模式均基于面向对象的核心原则(封装、继承、多态、抽象),强调通过接口、组合、委托等机制构建灵活、可维护的结构。
# 示例:装饰器模式(Python 实现)fromabcimportABC,abstractmethodclassComponent(ABC):@abstractmethoddefoperation(self)->str:passclassConcreteComponent(Component):defoperation(self)->str:return"ConcreteComponent"classDecorator(Component):def__init__(self,component:Component)->None:self._component=componentdefoperation(self)->str:returnf"Decorator({self._component.operation()})"# 使用示例simple=ConcreteComponent()decorated=Decorator(simple)print(decorated.operation())# 输出:Decorator(ConcreteComponent)适配器模式(Adapter)与代理模式(Proxy)虽然在结构上相似(都通过包装目标对象、实现相同接口、委托调用),但本质区别在于设计意图(purpose)和职责定位:
| 维度 | 适配器模式(Adapter) | 代理模式(Proxy) |
|---|---|---|
| 核心目的 | 解决接口不兼容问题,让原本因接口不匹配而无法协作的类/组件能够一起工作(“转换接口”)。 | 控制对目标对象的访问,在不改变客户端代码的前提下,为对象提供额外的间接层(“增强访问控制”)。 |
| 动机来源 | 面向复用已有代码(如遗留系统、第三方库),需适配其接口到当前系统契约。 | 面向增强行为或管理资源(如延迟加载、权限校验、日志记录、远程通信封装)。 |
| 是否修改语义 | 通常不改变目标对象的行为语义,仅做接口转换(如将request()转为send())。 | 可能扩展、拦截或替换原始行为(如代理可拒绝调用、缓存结果、异步转发)。 |
| 生命周期关系 | 适配器通常不控制目标对象的创建与销毁,目标对象常由客户端或外部提供。 | 代理常负责目标对象的创建、初始化甚至生命周期管理(如虚拟代理按需实例化)。 |
| 典型场景 | 将旧版XMLParser接口适配为新IDataSource接口;Java 中Collections.list()将 Enumeration 转为 List。 | 图像加载代理(延迟加载大图)、RMI 远程代理、Spring AOP 中的 JDK 动态代理。 |
✅ 简记口诀:
适配器是“翻译官”(语言不通,帮你转译);代理是“门卫+管家”(你不能直接见老板,我替你预约、审核、代收快递)。
# 适配器示例:将旧接口 DataReader.adapt() → 新接口 DataSource.read()classOldDataReader:defadapt(self)->str:return"raw data"classDataSource(ABC):@abstractmethoddefread(self)->str:passclassDataReaderAdapter(DataSource):def__init__(self,reader:OldDataReader):self._reader=readerdefread(self)->str:# 接口转换:adapt → readreturnf"Adapted:{self._reader.adapt()}"# 代理示例:控制访问 + 延迟初始化classExpensiveImage:def__init__(self,path:str):print("Loading heavy image...")self._path=pathdefdisplay(self)->str:returnf"Displaying{self._path}"classImageProxy(DataSource):def__init__(self,path:str):self._path=path self._real_image=None# 延迟加载defread(self)->str:ifself._real_imageisNone:self._real_image=ExpensiveImage(self._path)returnself._real_image.display()
编程学习
技术分享
实战经验