公司动态

90% 的人都搞混了!代理模式和适配器模式到底有什么区别?一篇文章彻底讲透!(附生活案例)

📅 2026/7/22 6:12:14
90% 的人都搞混了!代理模式和适配器模式到底有什么区别?一篇文章彻底讲透!(附生活案例)
很多 Java 初学者在学习设计模式时都会遇到两个非常容易混淆的模式代理模式Proxy Pattern适配器模式Adapter Pattern它们都需要引入一个中间对象类图看起来也很像因此很多人误以为它们是同一种模式。其实它们的目的完全不同。一句话记忆代理模式是增强功能适配器模式是转换接口。今天就带大家彻底搞懂它们的区别。一、代理模式是什么代理模式Proxy Pattern的核心思想是不改变原对象对原对象进行功能增强或控制访问。也就是说代理对象和真实对象实现的是同一个接口外部调用的是代理对象代理对象再去调用真实对象。例如用户 │ ▼ 代理对象 │ ▼ 真实对象代理对象可以在调用真实对象之前或之后增加一些额外逻辑例如权限校验日志记录缓存事务管理性能统计Java 示例定义接口publicinterfaceUserService{voidsave();}真实对象publicclassUserServiceImplimplementsUserService{Overridepublicvoidsave(){System.out.println(保存用户);}}代理对象publicclassUserServiceProxyimplementsUserService{privateUserServicetarget;publicUserServiceProxy(UserServicetarget){this.targettarget;}Overridepublicvoidsave(){System.out.println(记录日志);target.save();System.out.println(提交事务);}}执行UserServiceservicenewUserServiceProxy(newUserServiceImpl());service.save();输出记录日志 保存用户 提交事务可以看到真实对象没有修改但是功能增强了。二、适配器模式是什么适配器模式Adapter Pattern的核心思想是把一个已有接口转换成客户端需要的接口让原本不能一起工作的类能够协同工作。例如你的电脑只有Type-C 接口电脑 │ Type-C但是鼠标是USB接口怎么办需要USB鼠标 │ ▼ USB 转 Type-C 转接头 │ ▼ 电脑这个转接头就是适配器Adapter。它没有增强鼠标功能。只是把 USB 接口转换成 Type-C 接口。Java 示例旧接口publicclassUsbMouse{publicvoidusbConnect(){System.out.println(USB连接);}}目标接口publicinterfaceTypeC{voidconnect();}适配器publicclassMouseAdapterimplementsTypeC{privateUsbMousemouse;publicMouseAdapter(UsbMousemouse){this.mousemouse;}Overridepublicvoidconnect(){mouse.usbConnect();}}使用TypeCmousenewMouseAdapter(newUsbMouse());mouse.connect();最终USB 鼠标成功接入 Type-C 接口。三、代理模式和适配器模式最大的区别很多人觉得都是包装一个对象。没错。但是包装的目的完全不同。代理模式目的是增强功能。例如原来 登录 ↓ 代理以后 权限校验 ↓ 登录 ↓ 记录日志登录接口没有变化。只是增加功能。适配器模式目的是统一接口。例如原来USB现在Type-C通过Adapter变成Type-C功能没有增强。只是接口变了。四、生活中的例子代理模式例如明星客户 ↓ 经纪人 ↓ 明星客户不会直接找明星。而是找经纪人。经纪人负责谈价格安排行程签合同但是真正唱歌的人还是明星。所以经纪人就是代理。适配器模式例如出国旅游。中国插头两脚插头英国插座三脚插座怎么办需要转换插头作用不是增加充电速度。而是把中国标准转换成英国标准这就是适配器。五、代码上的区别代理模式通常代理类和真实对象实现同一个接口。例如UserService↑UserServiceImplUserServiceProxy调用proxy.save();实际上还是target.save();只是前后增加逻辑。适配器模式适配器实现的是客户端需要的新接口。内部调用旧接口。例如TypeC↑Adapter↓UsbMouse把USB变成Type-C六、Spring 中有哪些应用代理模式Spring 大量使用。例如Spring AOP声明式事务Transactional动态代理JDK ProxyCGLIB这些本质都是代理模式。适配器模式Spring MVC 中也大量存在。例如不同 Controller 方法StringModelAndViewResponseEntitySpring通过各种 Adapter统一处理。还有Spring MVC 的HandlerAdapter就是经典适配器模式。七、面试如何回答如果面试官问代理模式和适配器模式有什么区别推荐回答代理模式是在不改变原对象的基础上通过代理对象对原对象进行功能增强或访问控制例如日志、事务、权限校验等适配器模式则是将一个类的接口转换成客户端期望的接口解决接口不兼容的问题使原本不能协同工作的类能够一起工作。两者都通过包装对象实现但代理模式关注“增强功能”适配器模式关注“转换接口”。总结对比项代理模式Proxy适配器模式Adapter核心目的增强功能、控制访问转换接口、解决兼容性是否改变接口否与原对象接口一致是转换为新的接口是否增强功能是否典型场景AOP、事务、日志、权限接口兼容、第三方库接入、老系统改造生活案例经纪人代理明星USB 转 Type-C 转接头写在最后很多设计模式看起来代码结构相似但设计模式真正的区别不在代码而在设计意图。记住一句口诀代理模式增强功能不改接口适配器模式转换接口解决兼容。只要抓住这两个核心你就不会再把代理模式和适配器模式混淆了。