Python与设计模式之适配器的使用方法

适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

主要有两个实现方式:

1.使用继承--类适配器

2.使用组合--对象适配器

适用场景

1.想使用一个已经存在的类,而它的接口不符合你的要求

2.想使用一些已经存在的子类,但不可能对每一个都进行子类以匹配它们的接口,适配器可以匹配他们的父类接口。

#系统A的支付类抽象方法
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self,money):pass
#系统A的两个支付方式,AliPay,WechatPay.
class AliPay(Payment):def pay(self,money):print(f'支付宝支付了{money}元 ')class WechatPay(Payment):def pay(self,money):print(f'微信支付了{money}元')#系统B的支付方式 BankPay,ApplePay
class BankPay():def cost(self,money):print(f'银联支付了{money}元')
class ApplePay():def cost(self,money):print(f'苹果支付了{money}元')

一、使用继承

现在系统A要合并系统B,并统一对外提供接口,使得原来的接口不变

则新增一个系统A规划的类,同时继承Payment与BankPay,

class NewBankPay(Payment,BankPay):def pay(self,money):self.cost.pay(money)#client调用只由原来的BankPay()改为适配好的NewBankPay()p=NewBankPay()
p.pay(100) #这个则是去调用继续过来的父类BankPay的cost。这对外就统一了pay()方法。

二、使用组合方式

何为组合,简单提一下,就是有A类,B类,然后在B类的属性里加入A的对象。里调用 A类的实例对象。

#使用实例调用适配器,方法是继承父类,然后传入子类实例,来实现调用子类的方法
class PaymentAdater(Payment):def __init__(self,payment):#初始化把实例赋值给对象self.payment = paymentdef pay(self,money):#实际父类抽象方法self.payment.cost(money)p=PaymentAdapter(ApplePay())
p.pay(100)
------------------------------
苹果支付了100元

这样就实现在通过继承父类的方式,然后传入子类实际,实现调用子类的方法。对外依旧是封装了pay()方法。这样就实现了需要什么支付方式,就只需要传入子类的实例就行了。

-------------------------------------------------------

每天进步一点点,理解加深一点点。

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

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

相关文章

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

直流负载在新能源领域的作用有哪些

直流负载在新能源领域的作用主要体现在以下几个方面&#xff1a; 新能源如太阳能、风能等&#xff0c;其发电过程中产生的电能为直流电。传统的电力系统主要采用交流电&#xff0c;因此在新能源并网时需要进行逆变器转换。然而&#xff0c;逆变器在转换过程中会存在一定的能量损…

【话题】为什么选择成为了一名程序员?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景沉迷游戏回归学习机缘巧合兴趣驱动的选择职业发展的考虑兴趣与职业发展的结合结论文章推荐 背景 选择程序员之路&#xff1a;兴趣驱动还是职业发展&#xff1f; 在…

TS中const和readonly的区别

在TypeScript&#xff08;TS&#xff09;中&#xff0c;const 和 readonly 都是用于确保变量或属性不被重新赋值的工具&#xff0c;但它们的使用场景和语义有所不同。 作用域和生命周期&#xff1a; const 用于声明一个变量&#xff0c;并且这个变量的值在初始化后不能被重新赋…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

YOLC: You Only Look Clusters for Tiny Object Detection in Aerial Images

摘要 由于以下因素,从航拍图像中检测物体面临着重大挑战:1)航拍图像通常具有非常大的尺寸,通常有数百万甚至数亿像素,而计算资源有限。2)物体尺寸较小导致有效信息不足,无法进行有效检测。3)物体分布不均匀导致计算资源浪费。为了解决这些问题,我们提出YOLC(You Onl…

让更多的人能使用AI才能提升国内AI竞争力

随着人工智能技术的快速发展,AI正在深入影响我们的生活和工作。然而,目前AI技术的使用和应用主要集中在少数大型科技公司和研究机构,普通大众对AI技术的接触和使用还相对有限。如何让更多的人能够便捷地使用AI,从而带动整个国内AI产业的发展,已成为当前亟需解决的问题。 首先…

代码随想录三刷day45

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、力扣300. 最长递增子序列二、力扣674. 最长连续递增序列三 、力扣718. 最长重复子数组四、力扣1143. 最长公共子序列 前言 一个字符串的 子序列 是指这样一…

(实测可用)(2)Git的使用——如何在CSDN代码托管平台gitcode上托管自己的代码进行管理

一、CSDN 代码托管与Git使用 1、登录GitCode注册账号 (1)登录CSDN首页,选择GitCode; 2、生成SSH秘钥 (1)由于我们的本地git仓库和 GitCode仓库之间的传输是通过SSH加密的,所以我们需要配置SSH密钥。 注:安装了git工具,就可以使用ssh命令 (2)打开cmd命令行,输入…

Apache POI报表统计

Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POl 在 Java 程N序中对Miscrosoft Office各种文件进行读写操作。一般情况下&#xff0c;POI都是用于操作 Excel 文件。 导入Maven坐标&#xff1a; <dependency>&l…

若依集成mybatisplus报错找不到xml

引用&#xff1a;https://blog.csdn.net/qq_65080131/article/details/136677276 MybatisPlusAutoConfiguration中可以知道&#xff0c;系统会自动配置SqlSessionFactory&#xff0c;&#xff0c;但是&#xff0c;当你有自定义的SqlSessionFactory&#xff0c;&#xff0c;就会…

图搜索算法详解:广度优先搜索与深度优先搜索的探索之旅

图搜索算法详解&#xff1a;广度优先搜索与深度优先搜索的探索之旅 1. 广度优先搜索&#xff08;BFS&#xff09;1.1 伪代码1.2 C语言实现 2. 深度优先搜索&#xff08;DFS&#xff09;2.1 伪代码2.2 C语言实现 3. 总结 图搜索算法是计算机科学中用于在图结构中查找路径的算法。…

zigbee cc2530的室内/矿井等定位系统RSSI原理

1. 定位节点软件设计流程 2. 硬件设计 cc2530 最小系统 3. 上位机 c# 设计上位机&#xff0c;通过串口连接协调器节点&#xff0c;传输数据到pc上位机&#xff0c;显示节点坐标信息 4. 实物效果 需要4个节点&#xff0c;其中一个协调器&#xff0c;两个路由器作为参考节点&a…

面试集中营—mysql架构相关

一、Mysql基本架构 这个问题没太有人问&#xff0c;笔者也是浅尝辄止&#xff0c;但是了解一个中间件一定要从架构开始&#xff0c;上来就背八股文那就没意思了。 从下图可以看到Mysql的包括网络连接、服务、数据存储和系统文件&#xff08;日志&#xff09;四大部分。 数据连接…

Windows 平台上面管理服务器程式的高级 QoS 策略

在 Windows 平台上面&#xff0c;目前有两个办法来调整应用程式的 QoS 策略设置&#xff0c;一种是通过程式设置&#xff0c;一种是通过 “Windows 组策略控制”。 在阅读本文之前&#xff0c;您需要先查阅本人以下的几篇文献&#xff0c;作为前情提示&#xff1a; VC Windows…

什么是区块链?什么是X314协议?

X314协议是一种基于区块链技术的分布式账本协议&#xff0c;具有去中心化、安全性高和可扩展性强的特点。本文将从多个角度对X314协议进行通俗解释&#xff0c;带您了解这一前沿技术。 一、什么是区块链和分布式账本&#xff1f; 首先&#xff0c;我们需要了解什么是区块链和分…

2024年最新 CKA 试题题库及答案详解 导航页

1. Dokcer 基础相关 Docker 、 Docker-Compose 安装教程Docker基础知识、相关概念以及基本使用命令Docker 一句话删除所有镜像/容器 2. CKA 相关学习 CKA&#xff08;Certified Kubernetes Administrator&#xff09;是由 Cloud Native Computing Foundation&#xff08;CNC…

【k8s】(六)kubernetes1.29.4离线部署之-加入Node节点

备注&#xff1a; 完整版请参阅 【k8s】Kubernetes 1.29.4离线安装部署&#xff08;总&#xff09; 加入Node节点 根据执行命令生成第一个控制平面的结果&#xff0c;拷贝如下类似的文件到node节点。直接执行&#xff1a; kubeadm join x.x.x.x:6443 --token picxyk.su53y03l…

Python和R热释光动能朗伯W函数解析方程

&#x1f3af;要点 Python和R计算和绘图&#xff1a; &#x1f3af;一陷阱一复合中心模型计算&#xff1a;&#x1f58a;常微分方程求解器求解 | &#x1f58a;不同活化能和频率因子动力学参数下热释放光强度 | &#x1f58a;改变重捕获率 | &#x1f58a;数值解光热激发一阶动…

高斯过程回归【详细数学推导】

机器学习笔记 第一章 机器学习简介 第二章 感知机 第三章 支持向量机 第四章 朴素贝叶斯分类器 第五章 Logistic回归 第六章 线性回归和岭回归 第七章 多层感知机与反向传播【Python实例】 第八章 主成分分析【PCA降维】 第九章 隐马尔可夫模型 第十章 奇异值分解 第十一章 熵…