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

重拾设计模式-外观模式和适配器模式的异同

文章目录

  • 目的不同
    • 适配器模式:
    • 外观模式:
  • 结构和实现方式不同
    • 适配器模式:
    • 外观模式:
  • 对客户端的影响不同
    • 适配器模式:
    • 外观模式:

目的不同

适配器模式:

主要目的是解决两个接口不兼容的问题,使得原本不能一起工作的类可以协同工作。它侧重于接口的转换,就像是一个翻译器,将一种接口形式转换为另一种接口形式,让客户端能够以自己期望的方式调用被适配者的功能。例如,当系统需要使用一个旧接口的类来完成新接口定义的任务时,通过适配器来改变接口形式,使其匹配新的需求。

外观模式:

目的是为复杂的子系统提供一个简单、统一的高层接口,隐藏子系统的复杂性。它更像是一个一站式服务,通过一个简单的接口来封装一系列复杂的子系统操作,让客户端能够方便地使用子系统的功能,而不用关心子系统内部的细节和复杂的交互关系。例如,对于一个包含多个模块(如文件读取、数据解析、结果展示)的复杂数据处理子系统,外观模式提供一个统一的接口,让客户端只需调用这个接口就能完成整个数据处理流程。

结构和实现方式不同

适配器模式:

包含目标接口(Target)、被适配者(Adaptee)和适配器(Adapter)三个主要部分。适配器类实现目标接口,并且在内部持有被适配者的实例,通过调用被适配者的方法并进行必要的转换来实现目标接口的方法。例如,目标接口有方法request(),被适配者有方法specificRequest(),适配器的request()方法内部会调用被适配者的specificRequest()方法并进行适当的转换来适配接口。
有类适配器和对象适配器两种实现方式。类适配器通过继承来实现接口的适配,对象适配器通过组合(将被适配者作为成员变量)来实现。

外观模式:

主要由外观类(Facade)和子系统类(Subsystem Classes)组成。外观类知道哪些子系统类负责处理请求,并将客户端的请求代理给适当的子系统对象。外观类的方法通常是按照一定的业务逻辑顺序调用子系统类的多个方法来完成一个复杂的功能。例如,外观类有一个方法processData(),这个方法内部可能会依次调用子系统中的文件读取方法、数据解析方法和结果展示方法来完成数据处理。
外观类和子系统类之间是一种委托关系,外观类不改变子系统类的接口,只是将多个子系统类的操作组合起来,提供一个更方便的接口给客户端使用。

对客户端的影响不同

适配器模式:

客户端通过目标接口来调用适配器的方法,间接使用被适配者的功能。对于客户端来说,它只知道目标接口的存在,不需要了解被适配者的接口细节,但是它仍然需要知道如何正确地使用目标接口,因为目标接口定义了客户端所期望的操作方式。例如,客户端知道要调用目标接口的chargeWith5V()方法来充电,而不需要知道这个方法在内部是如何适配电源接口的。

外观模式:

客户端只需要和外观类的简单接口进行交互,不需要了解子系统内部有多少个类、每个类的功能和接口是什么。客户端调用外观类的一个方法,就可以完成一个复杂的功能,不需要关心这个功能是如何由子系统中的多个操作组合完成的。例如,客户端只需要调用外观类的processData()方法,就可以完成数据处理,而不用去关心文件是如何读取、数据是如何解析和展示的。


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

相关文章:

  • 【Windows版】opencv 和opencv_contrib配置
  • airflow docker 安装
  • 嵌入式C语言,函数指针参数的用法详解!!!
  • Linux下部署MySQL8.0集群 - 主从复制(一主两从)
  • springmvc的拦截器,全局异常处理和文件上传
  • 多智能体/多机器人网络中的图论法
  • 九江网站建设SEO与优化推广的完美结合
  • 【机器学习】机器学习的基本分类-强化学习-Deep Q-Network (DQN)
  • Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略
  • 10.1k高星 GitHub 库:告别JSON错误:Outlines如何提升大模型的结构化输出
  • PHP阶段一
  • 分布式专题(8)之MongoDB存储原理多文档事务详解
  • Pycharm访问MongoDB数据库
  • 如何解决MQ消息积压问题?
  • 牛客网 SQL36查找后排序
  • 基于 Qt C++ 的滚动屏实现
  • Unity 碎片化空间的产生和优化
  • 本地训练controlnet网络详解——以官方fill50k数据集为例
  • 数据结构与算法再探(三)树
  • 本地电脑使用命令行上传文件至远程服务器
  • Pydantic 2.0 完整指南
  • k8s 创建密钥以及证书安装
  • Jackson 的@JsonRawValue
  • Python 自带的日期日历处理大师:calendar 库
  • Paimon 是什么?Apache Paimon简介
  • 项目2路由交换