Python設(shè)計(jì)模式中的結(jié)構(gòu)型適配器模式
一、適配器模式
適配器,顧名思義是一種萬能的接口,達(dá)到萬能轉(zhuǎn)換的效果。
適配器模式,定義一個(gè)適配器類,并且在該類中定義了適配器接口,這些適配接口能夠?qū)⒃瓉碛捎诮涌诓患嫒荻荒茉谝黄鸸ぷ鞯亩喾N類型進(jìn)行適配,使得它們能夠一同工作。
二、應(yīng)用場景

三、代碼示例
實(shí)體角色:
目標(biāo)接口(Target):定義提供給 Client 訪問的接口,可以是一個(gè)抽象類或接口,也可以是具體類。
待適配的類 / 適配者類(Adaptee):被適配的角色,它們已經(jīng)存在了一些接口,是 Client 希望的業(yè)務(wù)方法,這些接口需要被適配。
適配器(Adapter):作為一個(gè)轉(zhuǎn)換器,對 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()方式二
適配器類通過__dict__ 將需要轉(zhuǎn)化的類的方法注冊到適配器,重載 __getattr__ 使其在適配器函數(shù)查無方法的時(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python?NumPy如何使用argsort方法進(jìn)行排序
NumPy提供了各種功能強(qiáng)大的數(shù)組操作方法,其中之一就是argsort方法,本文將詳細(xì)介紹argsort方法的使用,以及如何在實(shí)際項(xiàng)目中充分利用它進(jìn)行排序操作,希望對大家有所幫助2024-03-03
python實(shí)現(xiàn)倒計(jì)時(shí)小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)倒計(jì)時(shí)小工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
使用Python對IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)
這篇文章主要介紹了使用Python對IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié),包括使用socket模塊里的相關(guān)函數(shù)和匿名函數(shù)實(shí)現(xiàn),需要的朋友可以參考下2015-11-11
Python開發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能
這篇文章主要介紹了Python開發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能的相關(guān)資料,需要的朋友可以參考下2016-04-04
Python的Django框架中URLconf相關(guān)的一些技巧整理
這篇文章主要介紹了Python的Django框架中URLconf相關(guān)的一些技巧整理,包括視圖配置和debug的示例等,需要的朋友可以參考下2015-07-07
pandas 時(shí)間偏移的實(shí)現(xiàn)
時(shí)間偏移就是在指定時(shí)間往前推或者往后推一段時(shí)間,即加減一段時(shí)間之后的時(shí)間,本文使用Python實(shí)現(xiàn),感興趣的可以了解一下2021-08-08
python實(shí)現(xiàn)一次性封裝多條sql語句(begin end)
這篇文章主要介紹了python實(shí)現(xiàn)一次性封裝多條sql語句(begin end),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

