• 【Python笔记-设计模式】适配器模式


    一、说明

    适配器模式是一种结构型模式,它使接口不兼容的对象能够相互合作

    (一) 解决问题

    主要解决接口不兼容问题

    (二) 使用场景

    • 当系统需要使用现有的类,但类的接口不符合需求时
    • 当需要一个统一的输出接口,但输入类型不可预知时
    • 当需要创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作时

    二、结构

    1. 客户端(Client)是包含当前程序业务逻辑的类。
    2. 客户端接口(Client Interface)描述了其他类与客户端代码合作时必须遵循的协议。
    3. 服务(Service)中有一些功能类(通常来自第三方或遗留系统)。客户端与其接口不兼容,因此无法直接调用其功能。
    4. 适配器(Adapter)是一个可以同时与客户端和服务交互的类:它在实现客户端接口的同时封装了服务对象。适配器接受客户端通过适配器接口发起的调用,并将其转换为适用于被封装服务对象的调用。
    5. 客户端代码只需通过接口与适配器交互即可,无需与具体的适配器类耦合。因此,你可以向程序中添加新类型的适配器而无需修改已有代码。这在服务类的接口被更改或替换时很有用:你无需修改客户端代码就可以创建新的适配器类。

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 适配器模式
    5. 例:不同国家的电源插头不同,可通过适配器使用不同国家的插头进行供电
    6. """
    7. class ChinaPlug:
    8. """
    9. 定义中国的插头
    10. """
    11. @staticmethod
    12. def power_supply():
    13. return "中国的两脚插头供电中..."
    14. class USPlug:
    15. """
    16. 定义美国的插头
    17. """
    18. @staticmethod
    19. def power_supply():
    20. return "美国的两脚插头供电中..."
    21. class Adapter:
    22. """
    23. 定义适配器,支持使用多类插头
    24. """
    25. def __init__(self, plug):
    26. self.plug = plug
    27. def power_supply(self):
    28. return f"适配器使用{self.plug.__class__.__name__}供电中..."
    29. # 客户端代码
    30. if __name__ == "__main__":
    31. """
    32. 美国的两脚插头供电中...
    33. 中国的两脚插头供电中...
    34. ------------------------------
    35. 适配器使用ChinaPlug供电中...
    36. 适配器使用USPlug供电中...
    37. """
    38. us_plug = USPlug()
    39. china_plug = ChinaPlug()
    40. print(us_plug.power_supply())
    41. print(china_plug.power_supply())
    42. print("-" * 30)
    43. adapters = [Adapter(china_plug), Adapter(us_plug)]
    44. for adapter in adapters:
    45. print(adapter.power_supply())

    四、优缺点

    优点

    • 兼容性:可以让原本不兼容的接口协同工作,提高系统的兼容性
    • 复用性:可以复用现有的类,无需修改原有代码,符合开闭原则

    缺点

    • 增加了系统的复杂性:需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。

     跳转主页:【Python笔记】设计模式-CSDN博客

  • 相关阅读:
    Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理
    git 分支的使用
    postgresql 配置文件 与 修改配置如何启用
    配置centos 4.4.7 服务器(5)
    参数方程求导
    RabbitMQ实现数据库与ElasticSearch的数据同步和分享文件过期处理
    小程序设计基本微信小程序的校园生活助手系统
    Redis-Redis持久化,主从哨兵架构详解
    【目标检测】one-stage------YOLO v2浅析-2016
    【Java每日一题】— —第二十四题:编程定义一个长方形类Rectangle(2023.10.08)
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136193795