结构性设计模式Structural Design Patterns是一类用于处理类或对象的组合关系的设计模式其核心目标是简化系统结构、提高代码复用性与灵活性。你提到的四种模式——适配器Adapter、装饰器Decorator、代理Proxy和桥接Bridge——均属于GoFGang of Four提出的23种经典设计模式中的结构性模式共出现26次可能指在某教材、考试题库或代码实践场景中被提及/考察频次。适配器模式将一个类的接口转换成客户期望的另一个接口解决接口不兼容问题如旧组件接入新系统。装饰器模式动态地为对象添加职责避免通过子类继承导致类爆炸如Java I/O流、Python装饰器语法糖。代理模式为其他对象提供一个代理以控制对这个对象的访问如远程代理、虚拟代理、保护代理。桥接模式将抽象与实现解耦使二者可以独立变化如图形绘制API与具体绘图实现分离。它们的共同特点是关注“如何组合类和对象以形成更大的结构”强调类间关系的解耦与扩展性。# 示例简易装饰器模式PythonclassCoffee:defcost(self):return10classMilkDecorator:def__init__(self,coffee):self._coffeecoffeedefcost(self):returnself._coffee.cost()2# 动态增强功能# 使用basicCoffee()with_milkMilkDecorator(basic)print(with_milk.cost())# 输出12适配器模式Adapter与代理模式Proxy虽在UML类图中都常表现为“委托关系”即一个类持有另一个类的引用并转发调用但二者在设计意图、职责边界和运行时行为上存在本质区别✅1. 设计意图核心目的不同适配器模式解决接口不兼容问题是“补救性”模式。它让原本因接口不匹配而无法协同工作的类能一起工作如将第三方SDK的LegacyPaymentAPI适配为系统统一的PaymentService接口。代理模式提供对目标对象的间接访问控制是“增强性/管控性”模式。它在不改变目标对象的前提下附加额外逻辑如权限校验、日志记录、延迟加载、远程调用封装等。✅2. UML类图关键差异维度适配器模式代理模式接口关系适配器实现/继承客户端期望的接口同时持有被适配者Adaptee的引用Adaptee 与目标接口无继承关系。代理类与真实主题RealSubject共同实现同一接口或继承同一抽象类代理持有 RealSubject 引用。耦合焦点耦合于「接口转换」——关注如何让Adaptee符合Target接口。耦合于「访问控制」——关注如何在访问RealSubject前后插入横切逻辑。类名语义XXXAdapter如JsonToXmlAdapterXXXProxy如AuthProxy,CacheProxy✅3. 运行时行为差异适配器调用发生时适配器主动转换参数/返回值格式甚至重写算法逻辑例如将坐标系从笛卡尔转为极坐标其行为可能与Adaptee显著不同。代理调用发生时代理通常原样转发请求给RealSubject仅在前后添加拦截逻辑行为语义与RealSubject保持一致“透明代理”原则用户感知不到代理存在除非触发控制逻辑如鉴权失败。一句话总结适配器是“翻译官”改口音、换语法让听不懂的人能交流代理是“保安/经纪人”守大门、记日志、谈合同但不改本人说的话。// 适配器示例将旧接口适配为新接口interfacePaymentService{voidpay(doubleamount);}classLegacyBankAPI{voidmakeTransaction(intcents){/*...*/}}// 不兼容classBankAdapterimplementsPaymentService{privateLegacyBankAPIlegacy;publicvoidpay(doubleamount){intcents(int)(amount*100);legacy.makeTransaction(cents);// 转换单位调用}}// 代理示例控制访问interfaceImage{voiddisplay();}classRealImageimplementsImage{publicvoiddisplay(){System.out.println(Loading showing image...);}}classProxyImageimplementsImage{privateRealImagerealImage;privateStringfilename;publicProxyImage(Stringf){this.filenamef;}publicvoiddisplay(){if(realImagenull)realImagenewRealImage();// 懒加载realImage.display();// 原样转发仅加了初始化逻辑}}