适配器模式(Adapter pattern):是一种结构型设计模式,帮助我们实现两个不兼容的接口之前的兼容;样例:电子商务系统支持不同国家的货币交易,需要一个适配器,将其余的货币转化成一种货币最终进行交易。
设计模式一直遵从开放/封闭的原则(open/close principle),开放封闭原则是面向对象设计的的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改则是封闭的。
对于一些老旧代码进行重构这个有点不现实,对于一些厂商提供统一的接口,这个想修改原厂商的代码进行适配,这个更不切实际,所以适配器模式应运而生。
class Synthesizer:
def __init__(self, name):
self.name = name
def __str__(self):
return 'the {} synthesizer'.format(self.name)
def play(self):
return 'is playing an electronic song'
def get(self):
""" 多余添加的方法 """
return 'get a apple'
class Human:
def __init__(self, name):
self.name = name
def __str__(self):
return '{} the human'.format(self.name)
def speak(self):
return 'says hello'
def see(self):
""" 多余添加的方法 """
return 'see a people'
class Computer:
def __init__(self, name):
self.name = name
def __str__(self):
return 'the {} computer'.format(self.name)
def execute(self):
return 'executes a program'
def view(self):
""" 多余添加的方法 """
return 'view a program'
class Adapter:
def __init__(self, obj, adapted_methods):
self.obj = obj
# 此处只适函数方法,其余的本身属性并没有适配
self.__dict__.update(adapted_methods)
# 将剩余的未适配的属性一块适配,不然打印name属性就会报错
update_wrapper(self, obj)
def __str__(self):
return str(self.obj)
def main():
objects = [Computer('Asus')]
synth = Synthesizer('mog')
objects.append(Adapter(synth, dict(execute=synth.play, view=synth.get)))
human = Human('Bob')
objects.append(Adapter(human, dict(execute=human.speak, view=human.see)))
for i in objects:
print('{} {}'.format(str(i), i.execute()))
print('{}'.format(i.name))
print('{}'.format(i.view()))
if __name__ == '__main__':
main()