设计模式中的**结构型模式**,共7种,按“类/对象组合”维度分类
设计模式中的结构型模式共7种按“类/对象组合”维度分类具体包括适配器模式Adapter将一个类的接口转换成客户期望的另一个接口解决接口不兼容问题分为类适配器和对象适配器。桥接模式Bridge将抽象与实现解耦使二者可以独立变化常用于多维度变化的系统如不同平台不同图形渲染。装饰模式Decorator动态地为对象添加职责比子类继承更灵活如Java I/O流、Python装饰器思想。外观模式Facade为子系统提供统一的高层接口简化客户端调用如封装复杂API为简洁接口。享元模式Flyweight运用共享技术有效支持大量细粒度对象节省内存适用于字符、图标等重复对象场景。代理模式Proxy为其他对象提供代理以控制对它的访问如远程代理、虚拟代理、保护代理。组合模式Composite将对象组合成树形结构以表示“部分-整体”层次关系让客户端统一处理单个对象和组合对象如文件系统、UI组件树。这七种模式均聚焦于如何组织类与对象之间的关系以提升系统的灵活性、可扩展性与复用性。# 示例简单装饰器模式Python风格体现对象组合思想classComponent:defoperation(self):returnbasic operationclassDecorator(Component):def__init__(self,component:Component):self._componentcomponentdefoperation(self):returnfdecorated({self._component.operation()})# 使用baseComponent()decoratedDecorator(base)print(decorated.operation())# 输出decorated(basic operation)适配器模式Adapter与代理模式Proxy在结构上相似都通过包装目标对象、实现相同接口、委托调用但意图和应用场景存在本质区别维度适配器模式Adapter代理模式Proxy核心意图解决接口不兼容问题让原本因接口不匹配而无法协作的类能一起工作控制对目标对象的访问为对象提供一个替身或占位符以附加逻辑如权限、延迟、日志等动机来源外部已有类第三方库、遗留系统接口不符合当前需求需“转换”而非修改目标对象本身可用但需在访问前后/过程中增强行为或施加约束客户端视角客户端不知道也不关心被适配的对象只面向统一适配后的新接口客户端通常明确知道正在使用代理或至少感知到间接访问代理与真实对象接口一致但语义不同如“远程代理”暗示网络调用生命周期关系适配器通常不控制目标对象的创建与销毁仅封装已有实例代理常负责目标对象的创建、初始化、缓存或销毁如虚拟代理延迟加载智能引用代理管理生命周期典型场景将旧版Logger API适配为新ILogger接口将第三方支付SDK接口转为内部PayService接口访问远程服务远程代理、大图加载虚拟代理、权限校验保护代理、方法调用日志智能代理✅ 简记口诀适配器 “翻译官”语言不通帮你转译代理 “经纪人”你有权找本人但我替你安排、把关、增值。# 对比示例PythonfromabcimportABC,abstractmethodclassTarget(ABC):abstractmethoddefrequest(self)-str:...# —— 适配器转换Adaptee的incompatible接口classAdaptee:defspecific_request(self)-str:returnAdaptees specific resultclassAdapter(Target):def__init__(self,adaptee:Adaptee):self._adapteeadaptee# 组合已有对象defrequest(self)-str:returnfAdapter:{self._adaptee.specific_request()}# 接口转换# —— 代理控制对RealSubject的访问classRealSubject(Target):defrequest(self)-str:returnRealSubjects resultclassProxy(Target):def__init__(self):self._real_subjectNone# 延迟创建defrequest(self)-str:ifself._real_subjectisNone:self._real_subjectRealSubject()print(Proxy: checking access before forwarding...)returnself._real_subject.request()# 使用差异adapterAdapter(Adaptee())# 客户端只知Target不知AdapteeproxyProxy()# 客户端用Proxy隐含“受控访问”语义