结构型模式
适配器模式
定义
- 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
实现方式
场景:
- 需要实现不同国家人吃东西(eat)的接口
- 目前有现成的接口:印度人吃东西、美国人吃东西、中国人吃东西,但是各自吃东西的方式不同
from abc import ABC, abstractmethod
class Person(ABC):
@abstractmethod
def eat(self, food):
pass
class Indian:
def __init__(self, name):
self.name = name
def eat_with_hands(self, food):
print(f"{self.name}来自印度,他习惯通过手来吃东西,今天我们的晚餐是{food}")
class Chinese:
def __init__(self, name):
self.name = name
def eat_with_chopsticks(self, food):
print(f"{self.name}来自中国,他习惯通过筷子来吃东西,今天我们的晚餐是{food}")
class American:
def __init__(self, name):
self.name = name
def eat_with_knife_and_fork(self, food):
print(f"{self.name}来自美国,他习惯通刀叉来吃东西,今天我们的晚餐是{food}")
- 所以需要一个适配器来将三个国家人吃东西的方式和接口做匹配
1.类适配器:使用继承
class IndianAdapter(Person, Indian):
def eat(self, food):
self.eat_with_hands(food)
if __name__ == '__main__':
i = IndianAdapter("苏什玛·斯瓦拉杰")
i.eat("火锅")
苏什玛·斯瓦拉杰来自印度,他习惯通过手来吃东西,今天我们的晚餐是火锅
2.对象适配器,使用组合
class ChineseAdapter(Person):
def __init__(self, target):
self.target = target
super().__init__()
def eat(self, food):
self.target.eat_with_chopsticks(food)
if __name__ == '__main__':
c = Chinese("张三")
i = ChineseAdapter(c)
i.eat("火锅")
张三来自中国,他习惯通过筷子来吃东西,今天我们的晚餐是火锅
3.反射机制动态处理(不需要再创建多个类)
class Adapter:
def __init__(self, classname, method):
self.classname = classname
self.method = method
def eat(self, *args):
getattr(self.classname, self.method)(*args)
if __name__ == '__main__':
m = American("赫伯特· 乔治· 威尔斯")
a = Adapter(m, "eat_with_knife_and_fork")
a.eat("火锅")
赫伯特· 乔治· 威尔斯来自美国,他习惯通刀叉来吃东西,今天我们的晚餐是火锅
角色
- 目标接口
- 待适配的类
- 适配器类
使用场景