python 最简单的实现适配器设计模式的示例
作者:1_bit 发布时间:2021-10-14 12:07:59
适配器设计模式是懒得改动某些代码,或者某些接口不方便改动的时候,使用一个特定的封装,一些特定的编写办法,使不同的接口可以使用同种调用方式使用。
更简单的说话则是,例如几个不同的接口 aliyun、qiniuyun、tencentyun是新增的接口,以前都是使用接口yun进行文件备份,现在每一种调用不同名都太烦,统一使用yun去进行aliyun、qiniuyun、tencentyun上传文件。这个时候就需要写一个适配器。
现在看一个简单例子,有一个类为Upload 是一个上传类,里面有一个方法是yun方法:
class Upload:
def yun(self):
return '...... Uploading '
之后又新增了3个上传类,分别是 AliUpload、QiniuUpload、TencentUpload,如下代码:
class AliUpload:
def aliyun(self):
return '......aliyun Uploading '
class QiniuUpload:
def qiniuyun(self):
return '......qiniuyun Uploading '
class TencentUpload:
def tencentyun(self):
return '......tencentyun Uploading '
现在我想让它们里面的yun 方法都使用统一接口名为 uploadyun,需要编写一个适配器,代码如下:
class Adapter:
def __init__(self,yun,func):
self.yun=yun
self.__dict__.update(func)
init 方法接收两个参数,一个是yun,yun是yun对象,也就是 AliUpload、QiniuUpload、TencentUpload以及Upload 的对象,还有一个是func,需要统一名称的方法字典。调用方式如下:(代码比较冗余,不过对于某一部分读者会很直观)
首先新建yun的对象:
yun_obj=Upload()
aliyun_obj=AliUpload()
qiniuyun_obj=QiniuUpload()
tencentyun_obj=TencentUpload()
随后新建适配器对象,并且把以上的对象及方法传入到适配器初始化方法中:
aptyun=Adapter(yun_obj,dict(uploadyun=yun_obj.yun))
aptali=Adapter(aliyun_obj,dict(uploadyun=aliyun_obj.aliyun))
aptqiniu=Adapter(qiniuyun_obj,dict(uploadyun=qiniuyun_obj.qiniuyun))
apttencent=Adapter(tencentyun_obj,dict(uploadyun=tencentyun_obj.tencentyun))
由于我们需要通过使用调用 uploadyun 方法名统一调用,所以键为uploadyun,之后会成为类成员变量;最后直接用适配器对象进行统一名称的方法调用:
print(aptyun.uploadyun())
print(aptali.uploadyun())
print(aptqiniu.uploadyun())
print(apttencent.uploadyun())
结果如下:
统一名称后可以再一次封装,进行统一调用(此内容不是本文内容不再赘述)。
整体代码如下:
class Upload:
def yun(self):
return '...... Uploading '
class AliUpload:
def aliyun(self):
return '......aliyun Uploading '
class QiniuUpload:
def qiniuyun(self):
return '......qiniuyun Uploading '
class TencentUpload:
def tencentyun(self):
return '......tencentyun Uploading '
class Adapter:
def __init__(self,yun,func):
self.yun=yun
self.__dict__.update(func)
#新建类
yun_obj=Upload()
aliyun_obj=AliUpload()
qiniuyun_obj=QiniuUpload()
tencentyun_obj=TencentUpload()
#适配器类
aptyun=Adapter(yun_obj,dict(uploadyun=yun_obj.yun))
aptali=Adapter(aliyun_obj,dict(uploadyun=aliyun_obj.aliyun))
aptqiniu=Adapter(qiniuyun_obj,dict(uploadyun=qiniuyun_obj.qiniuyun))
apttencent=Adapter(tencentyun_obj,dict(uploadyun=tencentyun_obj.tencentyun))
#统一接口调用示例
print(aptyun.uploadyun())
print(aptali.uploadyun())
print(aptqiniu.uploadyun())
print(apttencent.uploadyun())
来源:https://blog.csdn.net/A757291228/article/details/107018206


猜你喜欢
- 1、subprocess这个模块来产生子进程,并且可以连接到子进程的标准输入、输出、错误中,还可以获得子进程的返回值。2、subproces
- 本文实例讲述了Selenium鼠标与键盘事件常用操作方法。分享给大家供大家参考,具体如下:Selenium是一个用于Web应用程序测试的工具
- 如下所示:def signal_xHz(A, fi, time_s, sample):return A * np.sin(np.linspa
- 在python3.6版本中去掉了os.path.walk()函数os.walk()函数声明:walk(top,topdown=True,on
- 段时间作项目中,遇到使用视图的问题,以前的工作中很少遇到视图,认为直接用表就ok了,何须视图呢?下面我来讲述一下它的功用:以往当我们查询数据
- 操作步骤进入命令行环境。我使用的是conda。有两种方式进入命令行。方法1:通过anconda navigator界面,选择environm
- 使用命令:os.system('python file_name.py')解释:os.system是执行当前的系统命令1、拿
- # encoding: UTF-8import threadimport time# 一个用于在线程中执行的函数def func():&nb
- 本文实例讲述了php实现XSS安全过滤的方法。分享给大家供大家参考。具体如下:function remove_xss($val) { &nb
- Go语言中 sync 包里提供了互斥锁 Mutex 和读写锁 RWMutex 用于处理并发过程中可能出现同时两个或多个协程(或线程)读或写同
- 如何用ADO批量更新记录?是的,ADO有这项功能,不过好像用的人不太多(不了解还是不会用呢?):<HTML> &nbs
- 机器学习之随机森林,供大家参考,具体内容如下1、Bootstraping(自助法)  
- 修改python运行路径import osos.chdir('C:/Users/86177/Desktop')os.chdi
- Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。使用property修饰的实例
- 一、命令格式:定义变量名称条件函数用“:”作为结尾下一级命令用空格键缩进,默认使用Tab键因为这样比较明显例如:yongHuMing = i
- 一、说明之前写了一篇“Python执行系统命令教程”讲了如何执行系统命令。除了执行系统命令外,我们有时还需要动态地执行一些python代码,
- 1. 问题描述水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数,水仙花数是指一个3位数,它的每个位上的数字的3次幂
- 一、xlsxwriter 基本用法,创建 xlsx 文件并添加数据官方文档:http://xlsxwriter.readthedocs.or
- 如何用php实现APP消息推送现在有很多的消息推送厂商,比如阿里云的消息推送,极光推送,融云的消息推送。他们的原理都是把sdk内置在app里
- NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes