Python设计模式 - 适配器模式

定义

适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换为客户端所期待的另一个接口。
注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。

结构

适配器模式可分为对象适配器模式和类适配器模式两种。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承关系。

对象适配器模式:
在这里插入图片描述

类适配器模式:
在这里插入图片描述

  • 目标抽象类(Target): 客户端希望使用的抽象类。
  • 适配者类(Adaptee): 需要适配的具体类。
  • 适配器类(Adapter): 作为一个转换器,对Adaptee和Target进行适配。

应用场景

  1. 复用现有代码:当你有现有的第三方库或遗留代码,这些代码与新的系统接口不兼容时,使用适配器模式可以使它们能够共同工作,而无需修改现有的代码。例如,旧的数据库访问类或旧的消息队列系统,通过适配器模式将它们与新的系统进行兼容。
  2. 多种外部系统对接:在系统需要与多个外部系统进行对接时,不同的外部系统可能会有不同的接口和协议。适配器模式可以帮助将这些不同的接口转换为统一的接口,从而简化集成工作。比如,可以将不同支付网关(如支付宝、微信支付、PayPal等)整合到统一的支付接口中,或将不同操作系统上的图像处理库通过适配器封装为统一接口。
  3. 当系统或接口升级时,新接口可能与旧系统不兼容。适配器模式可以将新接口转换为旧接口的形式,确保旧系统正常运行,无需大规模修改代码。例如,第三方API更新时,适配器可以将新接口转化为旧的调用方式,从而保持兼容性。

优缺点

优点:

  1. 解耦:适配器模式使得客户端和具体的实现类解耦。客户端只与适配器交互,而不直接依赖于具体的类实现,这样客户端无需关心具体实现的细节。
  2. 代码复用性高:通过使用适配器,可以将旧的或第三方的代码与新的系统无缝对接,避免重复开发。
  3. 易于扩展:通过引入新的适配器类,可以快速支持新的接口或协议,而不需要修改现有的代码。

缺点:

  1. 增加系统复杂性:适配器模式通过引入额外的适配器类来实现接口转换,这会使系统的结构更加复杂。在需要多个适配器时,会增加类的数量和相互关系,特别是当适配器层次过多时,可能会导致系统的维护变得更加困难。

代码示例

对象适配器模式

# 目标抽象类
class Payment:def pay(self, amount):pass# 支付宝支付类
class Alipay:def alipay_payment(self, amount):print(f"支付{amount}元,通过支付宝完成支付。")# 微信支付类
class WeChatPay:def wechat_payment(self, amount):print(f"支付{amount}元,通过微信支付完成支付。")# 支付宝适配器类
class AlipayAdapter(Payment):def __init__(self):self.alipay = Alipay()def pay(self, amount):self.alipay.alipay_payment(amount)# 微信支付适配器类
class WeChatPayAdapter(Payment):def __init__(self):self.wechat_pay = WeChatPay()def pay(self, amount):self.wechat_pay.wechat_payment(amount)# 客户端通过适配器来选择支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()alipay_adapter.pay(100)  # 支付100元,通过支付宝
wechat_adapter.pay(200)  # 支付200元,通过微信支付

类适配器模式

# 支付宝适配器类(类适配器)
class AlipayAdapter(Alipay, Payment):def pay(self, amount):# 调用Alipay类的支付方法self.alipay_payment(amount)# 微信支付适配器类(类适配器)
class WeChatPayAdapter(WeChatPay, Payment):def pay(self, amount):# 调用WeChatPay类的支付方法self.wechat_payment(amount)# 客户端通过适配器来选择支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()alipay_adapter.pay(100)  # 支付100元,通过支付宝
wechat_adapter.pay(200)  # 支付200元,通过微信支付

对象适配器模式和类适配器模式的比较

  1. 在类适配器模式中,由于适配器类是适配者类的子类,因此可以在适配器类中重写一些适配者的方法,使得适配器的灵活性更强。而在对象适配器模式中,适配器通过组合适配者类实现功能,要修改适配者的方法则需要通过委托和包装,操作上相对复杂。
  2. 在对象适配器模式中,一个对象适配器可以把多个不同的适配者适配到同一个目标。而在类适配器模式中,虽然可以通过继承多个适配者来实现,但这样会使类结构变得更加复杂,难以维护。
  3. 对象适配器模式 更适合需要高灵活性、能够适配多个不同对象或者无需修改适配者的场景。类适配器模式 适用于适配单一适配者并且对性能和实现简单性有较高要求的场景。

参考

《设计模式的艺术》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38410.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word中公式自动标号带章节编号

(1)插入一行三列的表格,设置宽度分别为0.5,13.39和1.5,设置纵向居中,中间列居中对齐,最右侧列靠右对齐,设置段落如下 (2)插入域代码 【Word】利用域代码快速实…

OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)

文章目录 摘要abstract论文摘要方法损失函数实验结论 总结 摘要 本周阅读了一篇关于新型图像风格化的论文《One-Shot Structure-Aware Stylized Image Synthesis》,旨在解决现有GAN模型在风格化过程中难以保持输入图像结构的问题。通过分离图像的结构和语义信息&am…

优先队列 priority_queue详解

说到&#xff0c;priority_queue优先队列。必须先要了解啥是堆与运算符重载(我在下方有解释)。 否则只知皮毛&#xff0c;极易忘记寸步难行。 但在开头&#xff0c;还是简单的说下怎么用 首先&#xff0c;你需要调用 #include <queue> 在main函数中&#xff0c;声明…

Matplotlib

一、Matplotlib快速入门 学习目标 了解什么是matplotlib 为什么要学习matplotlib matplotlib简单图形的绘制 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工…

【leetcode hot 100 131】分割回文串

解法一&#xff1a;回溯法动态规划法 回溯法&#xff1a; 假设我们当前搜索到字符串的第 i 个字符&#xff0c;且 s[0…i−1] 位置的所有字符已经被分割成若干个回文串&#xff0c;并且分割结果被放入了答案数组 ans 中&#xff0c;那么我们就需要枚举下一个回文串的右边界 j…

ToDesk云电脑各类鼠标有什么区别?虚拟/3D/游戏鼠标等各有利

不知道各位在使用ToDesk云电脑的时候是否是有注意到&#xff0c;这其中的鼠标竟有多种名称、多种模式可以选&#xff0c;比如锁定鼠标、3D鼠标、游戏鼠标这几项。 那么这些不同名称的鼠标都代表什么意思呐&#xff0c;又应该怎么选择、怎么用呐&#xff1f;本篇内容小编就为大…

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…

Bulk Rename Utility(BRU)——大批量重命名实用程序

Bulk Rename Utility&#xff08;BRU&#xff09;——大批量重命名实用程序 博主要给博客网站搞博客封面&#xff0c;几百张图没编号&#xff0c;一弄这个就好了&#xff0c;亲测十分好用&#xff0c;下面的b站教程更是一绝&#xff0c;快快使用起来 文章目录 Bulk Rename Ut…

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙&#xff08;OpenHarmony&#xff09;构建的分布式操作系统生态&#xff0c;旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务&#xff0c;覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测

基本介绍 适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均宽度百分比等等&#xff0c;可用于预测不确定性&#xff0c;效果如图所示&#xff0c;采用KDE&#xff0c;4种分布进行预测&#xff0c;有对比&#xff0c;可以替换成自己的数据。 …

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;为什么每个Java开发者都要懂JVM&#xff1f; 想象你是一名赛车手&#xff0c;Java是你的赛车&#xff0c;而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车&#xff0c;但要想在比赛中获胜&#xff0c;必须了解引擎如何工作&#…

鸿蒙harmonyOS笔记:练习CheckBoxGroup获取选中的值

除了视觉效果实现全选和反选以外&#xff0c;咱们经常需要获取选中的值&#xff0c;接下来看看如何实现。 核心步骤&#xff1a; 1. 给 CheckBoxGroup 注册 onChange。 2. CheckBox 添加 name 属性。 3. 在 onChange 的回调函数中获取 选中的 name 属性。 事件&#xff1a…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

Flink 内存管理

一、内存模型 上图是一个 Flink 程序进程总体的内存模型,其包含 Flink 使用内存、JVM 元空间以及 JVM 开销。 Flink 使用了堆上内存和堆外内存;框架内存使用了堆上内存和堆外内存的直接内存;Task 使用堆上内存和堆外内存的直接内存;管理内存、JVM 元空间以及 JVM 内存开销使…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源&#xff1a;国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明&#xff1a;内含原始文件和匹配结果&#xff0c;当试点城市在2014年及以后&#xff0c;赋值为1&#xff1b;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…

git的底层原理

git的底层原理 三段话总结git&#xff0c; 1. 工作原理&#xff1a;git管理是一个DAG有向无环图&#xff0c;HEAD指针指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

安装React开发者工具

我们在说组件之前&#xff0c;需要先安装一下React官方推出的开发者工具&#xff0c;首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器)&#xff0c;在输入框内搜索react&#xff0c;安装如下插件&#xff1a; 注意安装提供方为Facebook的插件&#xff0c;这…

排列与二进制

#include<iostream> using namespace std; int count_two(int n,int m){int count0;for(int i0;i<m;i){ //统计2的因子个数 int numn-i;while(num%20){count;num /2;}}return count; } int main(){int n,m;while(1){cin >> n >> m;if(n0 && m0)br…

鱼书--学习2

6. 与学习相关的技巧 6.1 参数的更新 &#xff08;1&#xff09; SGD的缺点&#xff1a;SGD低效的根本原因是&#xff0c;梯度的方向并没有指向最小值的方向 基于SGD的最优化的更新路径&#xff1a;呈“之”字形朝最小值(0, 0)移动&#xff0c;效率低 &#xff08;2&#x…