什么是适配器模式?
将一个接口转换成客户需要的接口,已达到在新对象中使用以前的旧接口。属于结构型模式,该模式主要解决对以前旧接口的兼容性。
UML类图
对象适配器
'''
示例: 键盘PS2圆形接口转USB接口
'''
import abc
# 目标接口
class AbsUSB(abc.ABC):
@abc.abstractmethod
def print(self): ...
# 以前旧接口
class AbsPS2(abc.ABC):
@abc.abstractmethod
def out(self): ...
# 旧对象
class KeyboardPS2(AbsPS2):
def out(self):
return "ps2"
# 适配器
class Adapter(AbsUSB):
def __init__(self, ps2: AbsPS2):
self.ps2 = ps2
def print(self):
'让旧ps2接口 兼容 usb 接口'
s = self.ps2.out()
return s + " to usb"
if __name__ == "__main__":
ps2 = KeyboardPS2() # 旧对象
usb = Adapter(ps2) # 通过适配器把旧对象转换成目标对象接口
p = usb.print()
print(p)
类适配器
'''
示例: 键盘PS2圆形接口转USB接口
类适配器模式是采用多继承的方式来实现
'''
import abc
# 目标接口
class AbsUSB(abc.ABC):
@abc.abstractmethod
def print(self): ...
# 以前旧接口
class AbsPS2(abc.ABC):
@abc.abstractmethod
def out(self): ...
# 旧对象
class KeyboardPS2(AbsPS2):
def out(self):
return "ps2"
# 适配器
class PS2AdapterUSB(AbsUSB, KeyboardPS2):
def print(self):
'让旧ps2接口 兼容 usb 接口'
s = self.out()
return s + " to usb"
if __name__ == "__main__":
usb = PS2AdapterUSB() # 通过适配器把旧对象转换成目标对象接口
p = usb.print()
print(p)
类适配器模式与对象适配器模式区别
类适配器是通过继承具体类型来实现的,强行把他们耦合在一起了;
对象适配器比类适配器更灵活和抽象,实现对具体类型解耦。
推荐使用对象适配器