设计模式中的**结构型模式**,共7种,按“类/对象组合”维度分类
2026/8/21 9:55:22 网站建设 项目流程

设计模式中的结构型模式,共7种,按“类/对象组合”维度分类,具体包括:

  • 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口,解决接口不兼容问题(分为类适配器和对象适配器)。
  • 桥接模式(Bridge):将抽象与实现解耦,使二者可以独立变化,常用于多维度变化的系统(如不同平台+不同图形渲染)。
  • 装饰模式(Decorator):动态地为对象添加职责,比子类继承更灵活(如Java I/O流、Python装饰器思想)。
  • 外观模式(Facade):为子系统提供统一的高层接口,简化客户端调用(如封装复杂API为简洁接口)。
  • 享元模式(Flyweight):运用共享技术有效支持大量细粒度对象,节省内存(适用于字符、图标等重复对象场景)。
  • 代理模式(Proxy):为其他对象提供代理以控制对它的访问(如远程代理、虚拟代理、保护代理)。
  • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”层次关系,让客户端统一处理单个对象和组合对象(如文件系统、UI组件树)。

这七种模式均聚焦于如何组织类与对象之间的关系,以提升系统的灵活性、可扩展性与复用性。

# 示例:简单装饰器模式(Python风格,体现对象组合思想)classComponent:defoperation(self):return"basic operation"classDecorator(Component):def__init__(self,component:Component):self._component=componentdefoperation(self):returnf"decorated({self._component.operation()})"# 使用base=Component()decorated=Decorator(base)print(decorated.operation())# 输出:decorated(basic operation)

适配器模式(Adapter)与代理模式(Proxy)在结构上相似(都通过包装目标对象、实现相同接口、委托调用),但意图和应用场景存在本质区别

维度适配器模式(Adapter)代理模式(Proxy)
核心意图解决接口不兼容问题:让原本因接口不匹配而无法协作的类能一起工作控制对目标对象的访问:为对象提供一个替身或占位符,以附加逻辑(如权限、延迟、日志等)
动机来源外部已有类(第三方库、遗留系统)接口不符合当前需求,需“转换”而非修改目标对象本身可用,但需在访问前后/过程中增强行为或施加约束
客户端视角客户端不知道也不关心被适配的对象,只面向统一适配后的新接口客户端通常明确知道正在使用代理(或至少感知到间接访问),代理与真实对象接口一致,但语义不同(如“远程代理”暗示网络调用)
生命周期关系适配器通常不控制目标对象的创建与销毁,仅封装已有实例代理常负责目标对象的创建、初始化、缓存或销毁(如虚拟代理延迟加载,智能引用代理管理生命周期)
典型场景将旧版Logger API适配为新ILogger接口;将第三方支付SDK接口转为内部PayService接口访问远程服务(远程代理)、大图加载(虚拟代理)、权限校验(保护代理)、方法调用日志(智能代理)

✅ 简记口诀:
🔹适配器 = “翻译官”(语言不通,帮你转译);
🔹代理 = “经纪人”(你有权找本人,但我替你安排、把关、增值)。

# 对比示例(Python)fromabcimportABC,abstractmethodclassTarget(ABC):@abstractmethoddefrequest(self)->str:...# —— 适配器:转换Adaptee的incompatible接口classAdaptee:defspecific_request(self)->str:return"Adaptee's specific result"classAdapter(Target):def__init__(self,adaptee:Adaptee):self._adaptee=adaptee# 组合已有对象defrequest(self)->str:returnf"Adapter:{self._adaptee.specific_request()}"# 接口转换# —— 代理:控制对RealSubject的访问classRealSubject(Target):defrequest(self)->str:return"RealSubject's result"classProxy(Target):def__init__(self):self._real_subject=None# 延迟创建defrequest(self)->str:ifself._real_subjectisNone:self._real_subject=RealSubject()print("Proxy: checking access before forwarding...")returnself._real_subject.request()# 使用差异:adapter=Adapter(Adaptee())# 客户端只知Target,不知Adapteeproxy=Proxy()# 客户端用Proxy,隐含“受控访问”语义

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询