Python設(shè)計(jì)模式中的結(jié)構(gòu)型適配器模式
一、適配器模式
適配器,顧名思義是一種萬(wàn)能的接口,達(dá)到萬(wàn)能轉(zhuǎn)換的效果。
適配器模式,定義一個(gè)適配器類,并且在該類中定義了適配器接口,這些適配接口能夠?qū)⒃瓉?lái)由于接口不兼容而不能在一起工作的多種類型進(jìn)行適配,使得它們能夠一同工作。
二、應(yīng)用場(chǎng)景
三、代碼示例
實(shí)體角色:
目標(biāo)接口(Target):定義提供給 Client
訪問(wèn)的接口,可以是一個(gè)抽象類或接口,也可以是具體類。
待適配的類 / 適配者類(Adaptee):被適配的角色,它們已經(jīng)存在了一些接口,是 Client 希望的業(yè)務(wù)方法,這些接口需要被適配。
適配器(Adapter):作為一個(gè)轉(zhuǎn)換器,對(duì) Adaptee
和 Target
進(jìn)行適配。
方式一
import abc class Mobile(metaclass=abc.ABCMeta): ? ? @abc.abstractmethod ? ? def call(self): ? ? ? ? pass class Xiaomi(Mobile): ? ? # 目標(biāo)接口 ? ? def call(self): ? ? ? ? print(f"使用{self.__class__.__name__}打電話") class Huawei(Mobile): ? ? # 目標(biāo)接口 ? ? def call(self): ? ? ? ? print(f"使用{self.__class__.__name__}打電話") # 待適配的類。新的手機(jī)品牌,打電話的接口與舊的 call 不一樣。 class Iphone: ? ? def dial(self): ? ? ? ? print(f"使用{self.__class__.__name__}打電話") # 待適配的類。新的手機(jī)品牌,打電話的接口與舊的 call 不一樣。 class Chuizi: ? ? def dial(self): ? ? ? ? print(f"使用{self.__class__.__name__}打電話") # 適配器,使得新的手機(jī)品牌打電話接口與舊的適配 class MobileAdapter(Mobile): ? ? def __init__(self, mobile): ? ? ? ? self.mobile = mobile ? ? def call(self): ? ? ? ? self.mobile.dial() if __name__ == "__main__": ? ? xiaomi = Xiaomi() ? ? xiaomi.call() ? ? huawei = Huawei() ? ? huawei.call() ? ? iphone = MobileAdapter(Iphone()) ? ? iphone.call() ? ? chuizi = MobileAdapter(Chuizi()) ? ? chuizi.call()
方式二
適配器類通過(guò)__dict__
將需要轉(zhuǎn)化的類的方法注冊(cè)到適配器,重載 __getattr__
使其在適配器函數(shù)查無(wú)方法的時(shí)候,執(zhí)行 getattr 方法。
class A: ? ? def a(self): ? ? ? ? print("我是A類的a方法") class B: ? ? def b(self): ? ? ? ? print("我是B類的b方法") class C: ? ? def c(self): ? ? ? ? print("我是C類的c方法") class Adapter: ? ? def __init__(self, classname, method): ? ? ? ? self.classname = classname ? ? ? ? self.__dict__update = method ? ? def __getattr__(self, attr): ? ? ? ? return getattr(self.classname, attr) def test(): ? ? objects = [] ? ? AA = A() ? ? objects.append(Adapter(AA, dict(test=AA.a))) ? ? BB = B() ? ? objects.append(Adapter(BB, dict(test=BB.b))) ? ? CC = C() ? ? objects.append(Adapter(CC, dict(test=CC.c))) ? ? for obj in objects: ? ? ? ? obj.test() test()
到此這篇關(guān)于Python設(shè)計(jì)中的結(jié)構(gòu)型適配器模式的文章就介紹到這了,更多相關(guān)Python適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python下的Softmax回歸函數(shù)的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇Python下的Softmax回歸函數(shù)的實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼
大家好,本篇文章主要講的是Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12利用Python命令行傳遞實(shí)例化對(duì)象的方法
最近在工作中遇到了一個(gè)問(wèn)題,需要接收啟動(dòng)腳本傳遞過(guò)來(lái)的實(shí)例化后的對(duì)象,通過(guò)在網(wǎng)上查找資料發(fā)現(xiàn)了兩個(gè)方法,文中通過(guò)實(shí)例代碼就給大家詳細(xì)介紹了這兩種方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-11-11python3 讀取Excel表格中的數(shù)據(jù)
這篇文章主要介紹了python3 讀取Excel表格中的數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2018-10-10使用 prometheus python 庫(kù)編寫自定義指標(biāo)的方法(完整代碼)
這篇文章主要介紹了使用 prometheus python 庫(kù)編寫自定義指標(biāo)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Python計(jì)算質(zhì)數(shù)的方法總結(jié)
質(zhì)數(shù)(Prime?Number)是指大于1且只能被1和自身整除的正整數(shù),計(jì)算質(zhì)數(shù)是數(shù)論中的一個(gè)經(jīng)典問(wèn)題,本文將介紹python中多種計(jì)算質(zhì)數(shù)的方法,希望對(duì)大家有所幫助2023-11-11python 實(shí)現(xiàn)手機(jī)自動(dòng)撥打電話的方法(通話壓力測(cè)試)
今天小編就為大家分享一篇python 實(shí)現(xiàn)手機(jī)自動(dòng)撥打電話的方法(通話壓力測(cè)試),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python的pandas類庫(kù)結(jié)構(gòu)參數(shù)
pandas是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,Pandas 納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具,需要的朋友可以參考下2023-07-07完美解決Python 2.7不能正常使用pip install的問(wèn)題
今天小編就為大家分享一篇完美解決Python 2.7不能正常使用pip install的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06