首頁 > 軟體

Python設計模式中的結構型介面卡模式

2022-02-15 10:02:00

一、介面卡模式

介面卡,顧名思義是一種萬能的介面,達到萬能轉換的效果。

介面卡模式,定義一個介面卡類,並且在該類中定義了介面卡介面,這些適配介面能夠將原來由於介面不相容而不能在一起工作的多種型別進行適配,使得它們能夠一同工作。

二、應用場景

三、程式碼範例

實體角色:

目標介面(Target):定義提供給 Client 存取的介面,可以是一個抽象類或介面,也可以是具體類。
待適配的類 / 適配者類(Adaptee):被適配的角色,它們已經存在了一些介面,是 Client 希望的業務方法,這些介面需要被適配。
介面卡(Adapter):作為一個轉換器,對 Adaptee Target 進行適配。

方式一

import abc

class Mobile(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def call(self):
        pass


class Xiaomi(Mobile):
    # 目標介面
    def call(self):
        print(f"使用{self.__class__.__name__}打電話")

class Huawei(Mobile):
    # 目標介面
    def call(self):
        print(f"使用{self.__class__.__name__}打電話")


# 待適配的類。新的手機品牌,打電話的介面與舊的 call 不一樣。
class Iphone:

    def dial(self):
        print(f"使用{self.__class__.__name__}打電話")


# 待適配的類。新的手機品牌,打電話的介面與舊的 call 不一樣。
class Chuizi:

    def dial(self):
        print(f"使用{self.__class__.__name__}打電話")


# 介面卡,使得新的手機品牌打電話介面與舊的適配
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__ 將需要轉化的類的方法註冊到介面卡,過載 __getattr__ 使其在介面卡函數查無方法的時候,執行 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()

到此這篇關於Python設計中的結構型介面卡模式的文章就介紹到這了,更多相關Python介面卡模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com