前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 最简单的实现适配器设计模式

python 最简单的实现适配器设计模式

作者头像
1_bit
发布2020-10-23 14:36:00
3420
发布2020-10-23 14:36:00
举报
文章被收录于专栏:我的知识小屋

适配器设计模式是懒得改动某些代码,或者某些接口不方便改动的时候,使用一个特定的封装,一些特定的编写办法,使不同的接口可以使用同种调用方式使用。

更简单的说话则是,例如几个不同的接口 aliyun、qiniuyun、tencentyun是新增的接口,以前都是使用接口yun进行文件备份,现在每一种调用不同名都太烦,统一使用yun去进行aliyun、qiniuyun、tencentyun上传文件。这个时候就需要写一个适配器。

现在看一个简单例子,有一个类为Upload 是一个上传类,里面有一个方法是yun方法:

代码语言:javascript
复制
class Upload:
    def yun(self):
        return '...... Uploading  '

之后又新增了3个上传类,分别是 AliUpload、QiniuUpload、TencentUpload,如下代码:

代码语言:javascript
复制
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,需要编写一个适配器,代码如下:

代码语言:javascript
复制
class Adapter:
    def __init__(self,yun,func):
        self.yun=yun
        self.__dict__.update(func)

init 方法接收两个参数,一个是yun,yun是yun对象,也就是 AliUpload、QiniuUpload、TencentUpload以及Upload 的对象,还有一个是func,需要统一名称的方法字典。调用方式如下:(代码比较冗余,不过对于某一部分读者会很直观)

首先新建yun的对象:

代码语言:javascript
复制
yun_obj=Upload()
aliyun_obj=AliUpload()
qiniuyun_obj=QiniuUpload()
tencentyun_obj=TencentUpload()

随后新建适配器对象,并且把以上的对象及方法传入到适配器初始化方法中:

代码语言:javascript
复制
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,之后会成为类成员变量;最后直接用适配器对象进行统一名称的方法调用:

代码语言:javascript
复制
print(aptyun.uploadyun())
print(aptali.uploadyun())
print(aptqiniu.uploadyun())
print(apttencent.uploadyun())

结果如下:

在这里插入图片描述
在这里插入图片描述

统一名称后可以再一次封装,进行统一调用(此内容不是本文内容不再赘述)。 整体代码如下:

代码语言:javascript
复制
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())
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档