適配器模式(Adapter Pattern)是做爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。python
這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。舉個真實的例子,讀卡器是做爲內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就能夠經過筆記原本讀取內存卡。設計模式
#!/usr/bin/env python # encoding: utf-8 class Target(object): def request(self): print 'Target request' class Adaptee(object): def specialRequest(self): print 'Adaptee specialRequest' class Adpater(object): def __init__(self, adpatee): self.adpatee = adpatee def request(self): self.adpatee.specialRequest() if __name__ == '__main__': objects = [] a = Target() b = Adaptee() objects.append(a) objects.append(Adpater(b)) #適配接口 for obj in objects: obj.request() #調用相同接口
適配器模式,是在類寫好以後,不想修改原類的代碼的方法,app
好比狗類有個wangwang()的方法,貓類有個miaomiao()的方法,羊類有個miemie()的方法,如今要讓他們都叫一下,要調用每一個類的不一樣方法。spa
寫個適配器類,能夠使貓經過適配器類調用wangwang()的方法,但實際的動做是執行了貓類的miaomiao()方法裏面的代碼。同理羊經過適配器類調用wangwang()的方法,但實際的動做是執行了羊類的miemie()方法裏面的代碼。設計
也能夠讓適配器寫一個speak的方法,把適配器的speak()方法重定向到狗 貓 羊各自的叫法。code
# coding=utf-8 class Dog(): def __init__(self, name): self.name = name def wangwang(self): print 'my name is' + self.name + '。。。汪汪汪。。。' def dog_run(self): print 'dog is running' class Cat(): def __init__(self, name): self.name = name def miaomiao(self): print 'my name is' + self.name + '。。。喵喵喵。。。' def cat_run(self): print 'cat is running' class Sheep(): def __init__(self, name): self.name = name def miemie(self): print 'my name is' + self.name + '。。。咩咩。。。' def sheet_run(self): print 'sheet is running' class Adapter(): def __init__(self,animal,adapted_methods): ''' :type adapted_methods: dict ''' self.__dict__.update(adapted_methods) def main(): animals = [Dog('旺財')] cat = Cat('大臉貓') sheep = Sheep('喜洋洋') animals.append(Adapter(cat, {'wangwang': cat.miaomiao,'dog_run':cat.cat_run})) animals.append(Adapter(sheep, {'wangwang': sheep.miemie, 'dog_run': sheep.sheet_run})) for a in animals: a.wangwang() a.dog_run() print '' def main2(): animals = [] dog = Dog('旺財') cat = Cat('大臉貓') sheep = Sheep('喜洋洋') animals.append(Adapter(cat, {'speak': dog.wangwang, 'run': dog.dog_run})) animals.append(Adapter(cat, {'speak': cat.miaomiao,'run':cat.cat_run})) animals.append(Adapter(sheep, {'speak': sheep.miemie, 'run': sheep.sheet_run})) for a in animals: a.speak() a.run() print '' if __name__ == "__main__": main() print '* ' * 20 main2()
main1即便標準的適配器模式,貓和羊經過適配器的wangwang()和dog_run()方法來實際執行各自的叫法和走法。blog
main2把狗和貓和羊統一經過適配器轉換,調用speak()和run()方法來實際執行各自的叫法和走法。接口
因此爲啥要適配器,就是不想改 狗 貓 羊的原有的代碼。內存
若是是一開始,還沒開始寫貓和狗和羊類就設計的話,那就在貓 狗 羊裏面叫speak方法和run方法。以下。utf-8
這樣就無需適配器來轉換了,也就變成了外觀模式了。
class Dog(): def __init__(self, name): self.name = name def speak(self): print 'my name is' + self.name + '。。。汪汪汪。。。' def run(self): print 'dog is running' class Cat(): def __init__(self, name): self.name = name def speak(self): print 'my name is' + self.name + '。。。喵喵喵。。。' def run(self): print 'cat is running' class Sheep(): def __init__(self, name): self.name = name def speak(self): print 'my name is' + self.name + '。。。咩咩。。。' def run(self): print 'sheet is running'
但有的東西先發明就改不了,就像安卓手機的充電線,有的是typec有的是非typec,想要用非typec的充電線給如今的新手機充電,若是不從新換一條數據線,那必須去淘寶買一個轉換頭了。