日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python設計模式中的結構型適配器模式_python

作者:范桂颶 ? 更新時間: 2022-04-20 編程語言

一、適配器模式

適配器,顧名思義是一種萬能的接口,達到萬能轉換的效果。

適配器模式,定義一個適配器類,并且在該類中定義了適配器接口,這些適配接口能夠將原來由于接口不兼容而不能在一起工作的多種類型進行適配,使得它們能夠一同工作。

二、應用場景

三、代碼示例

實體角色:

目標接口(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()

原文鏈接:https://is-cloud.blog.csdn.net/article/details/122928395

欄目分類
最近更新