题外话
最近看了一下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")