適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。
這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。舉個真實的例子,讀卡器是作為內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取內存卡。
#!/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() #調用相同接口
適配器模式,是在類寫好之后,不想修改原類的代碼的方法,
比如狗類有個wangwang()的方法,貓類有個miaomiao()的方法,羊類有個miemie()的方法,現在要讓他們都叫一下,要調用每個類的不同方法。
寫個適配器類,可以使貓通過適配器類調用wangwang()的方法,但實際的動作是執行了貓類的miaomiao()方法里面的代碼。同理羊通過適配器類調用wangwang()的方法,但實際的動作是執行了羊類的miemie()方法里面的代碼。
也可以讓適配器寫一個speak的方法,把適配器的speak()方法重定向到狗 貓 羊各自的叫法。
# 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()方法來實際執行各自的叫法和走法。
main2把狗和貓和羊統一通過適配器轉換,調用speak()和run()方法來實際執行各自的叫法和走法。
所以為啥要適配器,就是不想改 狗 貓 羊的原有的代碼。
如果是一開始,還沒開始寫貓和狗和羊類就設計的話,那就在貓 狗 羊里面叫speak方法和run方法。如下。
這樣就無需適配器來轉換了,也就變成了外觀模式了。
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的充電線給現在的新手機充電,如果不重新換一條數據線,那必須去淘寶買一個轉換頭了。