设计模式五:适配器模式
什么是适配器模式
实现两个或以上不兼容接口之间的兼容
使用场景
某个产品已制造出来之后,需要应对新的需求,希望其仍然有效
不兼容接口是他方的或者是老旧的,无法访问其源码或者修改起来不切实际,并且违反开放/封闭原则。
放开/封闭原则:面向对象设计的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改则是封闭的,意味着无需修改一个软件实体的源代码就能扩展其行为。
典型案例
在不同国家旅行,要为手机电脑充电,需要一个插头适配器,可以在不同国家使用
实例代码
class SQL:
def __init__(self,name):
self.name = name
def __str__(self):
return 'the {} SQL'.format(self.name)
def query(self):
return 'query data : 123456789'
class Serial:
def __init__(self,name):
self.name = name
def __str__(self):
return 'the {} Serial'.format(self.name)
def read(self):
return 'read buff : abcdefghijklmn'
class Internet:
def __init__(self,name):
self.name = name
def __str__(self):
return 'the {} IP address'.format(self.name)
def post(self):
return 'post value : user = admin password = 888888'
class Adapter:
def __init__(self,obj,adapted_methods):
self.obj = obj
#将特殊方法添加进适配器中
self.__dict__.update(adapted_methods)
def __str__(self):
return str(self.obj)
def main():
communication = []
sql = SQL('mysql')
#由于用户只知道一个getdata方法,所以将各种不同方法适配到适配器中
communication.append(Adapter(sql,dict(getdata = sql.query)))
serial = Serial('RS485')
communication.append(Adapter(serial,dict(getdata = serial.read)))
internet = Internet('websocket')
communication.append(Adapter(internet,dict(getdata = internet.post)))
#模拟用户只调用getdata方法
for i in communication:
print('{} {}'.format(i,i.getdata()))
if __name__ == "__main__":
main()