適配器模式(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()