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

server/2024/11/14 12:53:41/

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

主要有两个实现方式:

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.ppmy.cn/server/6491.html

相关文章

Java高阶私房菜:高并发之线程池底层原理学习

目录 什么是池化思想 什么是线程池 JDK中线程池关键类( ThreadPoolExecutor) 线程池设计原理和核心参数配置 ​编辑线程拒绝策略 Executors创建常见线程池种类 工具类创建线程池 应用场景问题解析 商品详情页聚合接口 商家管理后台业务报表数据…

Mac多媒体播放器 Movist Pro v2.11.4中文激活版下载

Movist Pro for Mac是一款专业的媒体播放器,特别为Mac用户设计。它不仅界面简洁美观,而且功能强大,能满足用户各种播放需求。 Movist Pro v2.11.4中文激活版下载 首先,Movist Pro for Mac支持多种媒体文件的播放,包括视…

鸢尾花数据集分类(决策树,朴素贝叶斯,人工神经网络)

目录 一、决策树 二、朴素贝叶斯 三、人工神经网络 四、利用三种方法进行鸢尾花数据集分类 一、决策树 决策树是一种常用的机器学习算法,用于分类和回归任务。它是一种树形结构,其中每个内部节点表示一个特征或属性,每个分支代表这个特征…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

微信小程序手机授权报错:pad block corrupted

微信小程序手机号授权登录,传参至后台解密,大概率都会成功,但是,偶尔会遇到解密失败,报错信息为: javax.crypto.BadPaddingException: pad block corrupted;在此记录一下解决方案。 更改前获取…

RAG与LLM本身知识存在冲突时,大模型如何抉择?

原文:https://arxiv.org/pdf/2404.10198.pdf 引言 在人工智能领域,大型语言模型(LLMs)因其强大的语言理解和生成能力而备受关注。然而,这些模型在处理特定问题时可能会产生错误信息,即所谓的“幻觉”&…

【笔记】vscode debug进入site-packages包源码

选择左侧栏第三个图标,点击创建 launch.json 文件 选择 Python Debugger 选择Python文件 这里可以看到launch.json 文件 在configurations中添加键值对 "justMyCode": false在文件中打上断点,点击"三角符"号开始调试 按F11或者红框…

力扣111. 二叉树的最小深度

思路:后序遍历左右中,但与最大深度细节上有大不同: 1、左右有一个为空时,取不为空的最小高度 2、都不为空时,对比左右深度取最小; 3、都为空时取0,可忽略; class Solution {public …