Python设计模式中的结构型适配器模式

作者:范桂飓 时间:2023-07-19 11:59:54 

一、适配器模式

适配器,顾名思义是一种万能的接口,达到万能转换的效果。

适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。

二、应用场景

Python设计模式中的结构型适配器模式

三、代码示例

实体角色:

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

标签:Python,设计,结构型,适配器,模式
0
投稿

猜你喜欢

  • 多种网页弹出窗口代码

    2007-11-24 21:13:00
  • python 多线程将大文件分开下载后在合并的实例

    2023-05-12 06:27:36
  • MySQL日志维护策略汇总

    2024-01-26 18:11:53
  • 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    2024-01-15 18:21:30
  • PHP之mysql位运算案例讲解

    2023-06-13 06:16:19
  • Python多线程和队列操作实例

    2023-02-06 07:23:54
  • jquery的父、子、兄弟节点查找,节点的子节点循环方法

    2023-07-02 05:34:40
  • 简单了解操作mysql数据库的命令行神器mycli

    2024-01-24 03:44:14
  • Mysql存储引擎MyISAM的常见问题(表损坏、无法访问、磁盘空间不足)

    2024-01-14 22:07:53
  • Python快速实现一个线程池的示例代码

    2021-06-01 04:51:01
  • 前女友发来加密的"520快乐.pdf",我用python破解开之后,却发现

    2023-07-17 20:33:16
  • 利用Python生成Excel炫酷图表

    2023-03-09 21:52:00
  • 用Mysql查询语句记录

    2011-02-16 12:29:00
  • CSS编写过程中常见的10个错误

    2008-05-29 12:49:00
  • 如何实现全文检索?

    2010-05-24 18:24:00
  • MySQL Semisynchronous Replication介绍

    2024-01-12 19:42:02
  • python实现搜索本地文件信息写入文件的方法

    2023-01-19 10:21:47
  • 对Python中DataFrame按照行遍历的方法

    2023-01-03 23:08:59
  • Python类的用法实例浅析

    2023-07-31 11:17:18
  • Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError

    2023-07-07 06:58:52
  • asp之家 网络编程 m.aspxhome.com