使用适配器模式使用两个或是多个不兼容的接口兼容。在不修改不兼容代码的情况下使用适配器模式实现接口一致性。通过Adapter 类实现。
例子: 一个俱乐部类Club,艺术加被请到俱乐部在表演节目: organize_performance()
Musician类 play() 方法 Dancer 类主要是dance() 方法执行 (external.py)
外部模块导入(adapter.py)创建一个通用的 Adapter类调整不兼容的对象。
init() 方法的obj 参数是需要修改的对象,adapted_methods 是一个字典,包含与客户端调用的方法和应该调用方法匹配的键值对。
chapter04/external.py
class Musician:
def __init__(self, name):
self.name = name
def __str__(self):
return f'the musician {self.name}'
def play(self):
return 'plays music'
class Dancer:
def __init__(self, name):
self.name = name
def __str__(self):
return f'the dancer {self.name}'
def dance(self):
return 'does a dance performance'
chapter04/adapter.py
from external import Musician, Dancer
class Club:
def __init__(self, name):
self.name = name
def __str__(self):
return f'the club {self.name}'
def organize_event(self):
return 'hires an artist to perform for the people'
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():
objects = [Club('Jazz Cafe'), Musician('Roy Ayers'), Dancer('Shane Sparks')]
for obj in objects:
if hasattr(obj, 'play') or hasattr(obj, 'dance'):
if hasattr(obj, 'play'):
adapted_methods = dict(organize_event=obj.play) # 设置调用方法统一organize_event
elif hasattr(obj, 'dance'):
adapted_methods = dict(organize_event=obj.dance) # 设置调用方法统一organize_event
# referencing the adapted object here
obj = Adapter(obj, adapted_methods)
print(f' 输出 {obj} {obj.organize_event()}') # 调用统一方法
if __name__ == "__main__":
main()
输出 the club Jazz Cafe hires an artist to perform for the people
输出 the musician Roy Ayers plays music
输出 the dancer Shane Sparks does a dance performance