设计模式-适配器模式-python实现

题外话

最近看了一下JAVA的设计模式,有点儿感触。但是平时用python用的比较多,所以想用python实现一下几个模式。欢迎大家给予指导。

# 这个网站学习资料不错,特此分享一下
http://c.biancheng.net/view/1361.html
适配器模式的理解
  • 通俗理解
    可以对应到我们生活中的数据线,笔记本电脑不能直接使用手机上的数据,但是笔记本和手机之间加上一根数据线,笔记本就能通过数据线访问手机上的数据了,此时数据线就是一个适配器。
  • 书面理解(借鉴http://c.biancheng.net/view/1361.html)
    将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
  • 开发中的场景
    假设我们环境中已经存在了一个接口,突然有一天,有个系统要调用这个接口,但是入参有些不匹配,比如下图,

在这里插入图片描述

  • 一个解决办法,就是我们改一下接口,判断一下limit参数,做一个类型判断,最终都转换为Int类型
    违背了开闭原则,修改了之前的代码
  • 给甲方写一个接口,集成现有接口,并新加一个方法,做一个类型转换,然后再调用 现有接口
    增加了类的耦合,其实也是个办法。但是继承的时候,我们还是要关心一下已有接口类的构成,比如初始化方法等
  • 增加一个适配类,定一个给甲方爸爸的接口,接收甲方参数,和现有接口对象
    在这里插入图片描述
UML 结构图(引自http://c.biancheng.net/view/1361.html)

在这里插入图片描述

试着写一下代码

在这里插入图片描述

# 现有查询接口
class InformationQuery:

    def __init__(self):
        pass

    def query(self, name, limit):

        print(f"name is: ${name}, limit is: ${limit} (${type(limit)})")
# 适配器抽象类
class QueryAdapter(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def query(self, name, limit):
        pass
# 适配器具体实现类(为甲方爸爸写的适配器)
class FatherAdapter(QueryAdapter):

    def __init__(self, informationQuery):
        self.informationQuery = informationQuery

    def query(self, name, limit):
        self.informationQuery.query(name, int(limit))
# 客户端类(甲方爸爸这样用)
if __name__ == "__main__":
    informationQuery = InformationQuery.InformationQuery()
    fatherAdapter: QueryAdapter = FatherAdapter.FatherAdapter(informationQuery)
    fatherAdapter.query("test", "1")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值