設計模式-結構型模式,適配器模式(4)

適配器模式(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的充電線給如今的新手機充電,若是不從新換一條數據線,那必須去淘寶買一個轉換頭了。

相關文章
相關標籤/搜索