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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM