当前位置: 首页 > article >正文

重温设计模式--代理、中介者、适配器模式的异同

文章目录

      • 1、相同点
      • 2、不同点

1、相同点

  • 目的都是为了更好地处理对象之间的关系:这三种模式都是在软件设计中用于处理对象之间的关联和交互,以达到优化系统结构、增强可维护性等目的。它们都在一定程度上隐藏了对象之间的某些细节或者复杂性,使得系统的设计更加合理。
  • 都属于结构型设计模式:中介者模式、代理模式和适配器模式都归类于结构型设计模式。结构型设计模式主要关注如何将类或对象组合成更大的结构,以满足软件系统的需求。这三种模式通过不同的方式来组织和协调对象之间的关系,从而构建出更灵活、易于维护的系统架构。

2、不同点

  • 功能和作用重点不同
    • 中介者模式:重点在于协调多个对象之间的复杂交互关系。它通过引入一个中介者对象,使得各个对象之间不再直接相互引用,而是将交互的请求和信息都发送给中介者,由中介者来统一处理和协调这些交互。例如,在一个多人在线游戏的社交系统中,玩家之间的聊天、组队、交易等复杂交互都通过游戏服务器(中介者)来进行协调,降低了玩家之间的耦合度,使得系统的交互逻辑更加集中和易于管理。
    • 代理模式:主要用于控制对另一个对象的访问。代理对象在客户端和目标对象之间起到一个中间人的作用,它可以在访问目标对象之前或之后执行一些额外的操作,如权限验证、延迟加载、缓存等。例如,在一个网络代理服务器中,它作为客户端访问互联网资源(目标对象)的代理,会先验证客户端的访问权限,然后再转发请求,同时还可能对经常访问的资源进行缓存,提高访问效率。
    • 适配器模式:侧重于解决接口不兼容的问题。当一个类的接口与期望的接口不匹配时,适配器模式提供了一种将一个类的接口转换成客户端所期望的另一种接口的方式。例如,在一个新的支付系统中,旧的银行接口与新的支付接口不兼容,通过适配器可以将旧接口的调用转换为符合新支付接口要求的形式,使得旧系统能够与新系统协同工作。
  • 对象之间的关系和协作方式不同
    • 中介者模式:多个同事对象(Colleague)都与中介者(Mediator)对象进行通信,中介者对象知道所有同事对象,并协调它们之间的交互。同事对象之间一般不直接交互,它们的交互请求都通过中介者来中转和处理。例如,在一个智能家居系统中,各种智能设备(同事对象)如灯、空调、窗帘等都和智能家居中控系统(中介者)通信,当用户通过手机APP控制这些设备时,APP将指令发送给中控系统,中控系统再根据指令协调各个设备之间的联动,如开灯的同时拉上窗帘等。
    • 代理模式:代理对象和目标对象之间是一种代理关系。代理对象代表客户端来访问目标对象,客户端只与代理对象交互,而代理对象在内部管理对目标对象的访问。例如,在一个远程对象代理的场景中,客户端调用本地的代理对象,代理对象负责将请求通过网络发送到远程的目标对象,并将目标对象的响应返回给客户端。
    • 适配器模式:适配器对象同时关联了被适配对象(Adaptee)和目标接口(Target)。它实现了目标接口,并在内部将目标接口的调用转换为对被适配对象的调用。例如,在一个将旧数据库接口适配到新的应用程序接口的场景中,适配器对象实现了新应用程序所期望的数据库访问接口,在内部将这些接口的调用转换为对旧数据库接口的调用方式,使得旧数据库能够在新应用程序中正常使用。
  • 应用场景不同
    • 中介者模式:适用于存在多个对象之间复杂交互且需要集中管理这些交互的场景,如GUI系统中的组件交互、游戏中的角色交互系统、企业信息系统中的模块间协作等。
    • 代理模式:常用于需要控制对对象的访问权限、进行资源访问优化(如缓存、延迟加载)或者远程访问对象的情况,如网络代理、安全代理、虚拟代理等。
    • 适配器模式:主要用于系统集成、接口升级等场景,当需要将不兼容的接口进行整合或者旧系统与新系统协同工作时,就会用到适配器模式,如软件系统的接口更新、硬件设备接口的转换等。

http://www.kler.cn/a/451767.html

相关文章:

  • 大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
  • Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
  • 【ES6复习笔记】对象方法扩展(17)
  • iClient3D for Cesium 加载shp数据并拉伸为白模
  • Idea导入Springboot项目,无法正确加载yml文件,且不为绿色图标的解决办法
  • 模型优化之知识蒸馏
  • 两道数组有关的OJ练习题
  • ubuntu使用ffmpeg+ZLMediaKit搭建rtsp推流环境
  • Android14 OTA升级速度过慢问题解决方案
  • PR基础(2)
  • Java 中反射的高级用法:窥探 Java 世界的魔法之门
  • 《Vue进阶教程》第二十课:lazy懒执行
  • HDMI、MIPI、DP的区别和用途
  • Spring_05_IOC容器启动细节
  • 亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型
  • vue3入门教程:reactive函数
  • 04、Vue与Ajax
  • Neo4j Desktop 无法打开
  • 字符编码(二)
  • V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网
  • Info.plist contained no UIScene configuration dictionary (looking for configura
  • What‘s the term “unused memory“ in PyTorch?
  • 16爬虫:使用requests和scrapy分别从链家获取二手房信息
  • 什么是微端游戏?微端应该选择什么配置的服务器?
  • 2024 Gartner 数据库魔力象限概要解读
  • js和html中,将Excel文件渲染在页面上