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

news/2024/12/22 14:14:27 标签: 设计模式, 外观模式, 适配器模式

文章目录

目的不同

适配器模式

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

外观模式

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

结构和实现方式不同

适配器模式

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

外观模式

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

对客户端的影响不同

适配器模式

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

外观模式

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


http://www.niftyadmin.cn/n/5795424.html

相关文章

python中的局部变量、全局变量问题的思考(对比于c语言)

今天在运行python时遇到了局部变量和全局变量的问题,令我很迷惑。 首先,我在学习python之前先学习了c语言,所以c语言的一些东西影响了我对这个问题的思考。 在c语言中 局部变量和全局变量的区别就在于作用域的范围大小。在c语言中&#xf…

TCP/IP协议:网际层相关知识梳理

目录 一、网际层简述 二、为什么要有网际层? 三、TCP/IP软件在路由式网络中的数据发送策略流程 3.1. 同网段传输 3.2. 跨网段传输 a. 发送到网关 b. 经过多个网关转发 c. 到达目的网段 四、网际层涉及的网络设备 4.1. 路由器 4.2. 三层交换机 4.3. 网关 五、总结…

2024年前端面试题【基本功篇】

文章目录 前言一、html 相关1.1 行内元素和块级元素分别有哪些?1.2 IE盒子模型和标准盒子模型 二、css 相关2.1 选择器2.2 设置垂直居中的方法2.3 定位的几种方式2.4 清除浮动的几种方式2.5 rem、em、px、vw、vh区别2.6 响应式和自适应布局的区别2.7 元素隐藏的几种…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

cenos如何升级git到2以上版本

1:先卸载旧的版本: # 卸载源默认安装的git $ git --version git version 1.8.3.1 $ sudo yum remove git2: 安装新的git版本 编译 配置环境变量 下载相关依赖 并安装 [rootlocalhost /]# yum install curl-devel expat-devel openssl-devel zlib-devel gcc […

vi或vim进行替换

vi 中去搜索特定字符串cdc_,替换为aaa_ 在 vi 或 vim 编辑器中,你可以使用以下命令来查找特定的字符串 cdc_ 并将其替换为 aaa_: 打开文件: vi filename 搜索 /cdc_ 按n 是搜索下一个 进入替换模式: :%s/cdc_/aaa_/g 解释&#…

《python的数学函数绘图软件》

大家好,我是陈辰学长,一名在 Java 圈辛勤劳作的码农。今日要和大家分享的是一款《python的数学函数绘图软件》毕业设计项目。项目源码以及部署相关事宜,请联系陈辰学长,文末会附上联系信息哦。 🌟作者:陈辰…

开源轮子 - Logback 和 Slf4j

spring boot内置:Logback 文章目录 spring boot内置:Logback一:Logback强在哪?二:简单使用三:把 log4j 转成 logback四:日志门面SLF4J1:什么是SLF4J2:SLF4J 解决了什么痛…