AI 助理
备案 控制台
开发者社区 开发与运维 文章 正文

Python 设计模式:适配器模式

简介: 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。通过组合对象的方式来创建新功能。

什么是适配器


适配器帮助我们使两个不兼容的接口兼容。这到底是什么意思呢?如果我们有一个旧的组件,我们想在一个新的系统中使用它,或者我们想在一个旧的系统中使用一个新的组件。两者很少能在不需要修改代码的情况下进行交流。


但是,改变代码并不总是可能的,要么是因为我们无法访问它,要么是因为它不切实际。在这种情况下,我们可以写一个额外的层,对两个接口之间的通信进行一些必要的修改,在两个接口之间实现通信。


这个层被称为适配器。


适配器的作用


适配器不仅可以转换不同格式的数据, 其还有助于采用不同接口的对象之间的合作。 它的运作方式如下:

  1. 适配器实现与其中一个现有对象兼容的接口。
  2. 现有对象可以使用该接口安全地调用适配器方法。
  3. 适配器方法被调用后将以另一个对象兼容的格式和顺序将请求传递给该对象。


有时你甚至可以创建一个双向适配器来实现双向转换调用。


真实世界的例子


不同的电子产品的适配接口也不一样,比如相机和手机的接口不同。当你使用不同的电子产品,需要不同读取数据的接口:USB、HDMI、VGA 等接口。


适配器模式结构

对象适配器

当我们的 client 想要打开风扇,而风扇提供了 turnOn 方法,直接调用 turnOn 即可享受凉爽的风,比如下图:


image.png

然后同样是打开的操作,client 想通过 turnOn 调用打开电视机,而电视机没有这个方法,电视机提供的 open 方法。

image.png

如果我们直接把 open 方法改为 turnOn 的方法,可能会引发系统的一系列其他问题,这个时候就需要我们的适配器模式了。


客户端可以会使用各种各样的适配器,为了方便保存,可以为适配器抽象出一个接口,UML 图如下:


image.png


适配器 (Adapter) 是一个可以同时与客户端和服务交互的类: 它在实现客户端接口的同时封装了服务对象。 适配器接受客户端通过适配器接口发起的调用, 并将其转换为适用于被封装服务对象的调用。


客户端代码只需通过接口与适配器交互即可, 无需与具体的适配器类耦合。 因此, 你可以向程序中添加新类型的适配器而无需修改已有代码。 这在服务类的接口被更改或替换时很有用: 你无需修改客户端代码就可以创建新的适配器类。


代码如下:

public interface IAdapter {
  public void turnOn(); // 通用开机函数
}
public class Tv {
  public void open() {
    System.out.println("电视机 TV 开机,只能使用 open 函数");
  }
}
public class TvAdapter extends Tv implements IAdapter {
  public void turnOn() {
    super.open(); // 适配器模式
  }
}


调用方式:

public class Main {
  public static void main(String[] args) {
    IAdapter adapter = new TvAdapter();
    adapter.turnOn();
  }
}

类适配器

这一实现使用了继承机制: 适配器同时继承两个对象的接口。 请注意, 这种方式仅能在支持多重继承的编程语言中实现, 例如 C++。


image.png

Python 实现

class Target:
    """
    The Target defines the domain-specific interface used by the client code.
    """
    def request(self) -> str:
        return "Target: The default target's behavior."
class Adaptee:
    """
    The Adaptee contains some useful behavior, but its interface is incompatible
    with the existing client code. The Adaptee needs some adaptation before the
    client code can use it.
    """
    def specific_request(self) -> str:
        return ".eetpadA eht fo roivaheb laicepS"
class Adapter(Target, Adaptee):
    """
    The Adapter makes the Adaptee's interface compatible with the Target's
    interface via multiple inheritance.
    """
    def request(self) -> str:
        return f"Adapter: (TRANSLATED) {self.specific_request()[::-1]}"
def client_code(target: "Target") -> None:
    """
    The client code supports all classes that follow the Target interface.
    """
    print(target.request(), end="")
if __name__ == "__main__":
    print("Client: I can work just fine with the Target objects:")
    target = Target()
    client_code(target)
    print("\n")
    adaptee = Adaptee()
    print("Client: The Adaptee class has a weird interface. "
          "See, I don't understand it:")
    print(f"Adaptee: {adaptee.specific_request()}", end="\n\n")
    print("Client: But I can work with it via the Adapter:")
    adapter = Adapter()
    client_code(adapter)


运行该程序:

Client: I can work just fine with the Target objects:
Target: The default target's behavior.
Client: The Adaptee class has a weird interface. See, I don't understand it:
Adaptee: .eetpadA eht fo roivaheb laicepS
Client: But I can work with it via the Adapter:
Adapter: (TRANSLATED) Special behavior of the Adaptee.

适配器模式优缺点

优点:

  • 单一职责原则你可以将接口或数据转换代码从程序主要业务逻辑中分离。
  • 开闭原则。 只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。

缺点:

  • 代码整体复杂度增加, 因为你需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。
后端技术牛仔
目录
相关文章
艾利克斯冰
|
26天前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
艾利克斯冰
17 2
baker_zhuang
|
11天前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
baker_zhuang
27 0
阿里云服务开发者
|
5月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
阿里云服务开发者
38 0
杀死一只知更鸟debug
|
25天前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
杀死一只知更鸟debug
27 0
1288912195458132
|
2月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
1288912195458132
31 0
python之工厂设计模式
热爱技术的小郑
|
2月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
热爱技术的小郑
43 1
toddli
|
2月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
toddli
41 0
众所周知
|
3月前
|
设计模式 机器学习/深度学习 测试技术
设计模式转型:从传统同步到Python协程异步编程的实践与思考
【7月更文挑战第15天】探索从同步到Python协程异步编程的转变,异步处理I/O密集型任务提升效率。async/await关键词定义异步函数,asyncio库管理事件循环。面对挑战,如思维转变、错误处理和调试,可通过逐步迁移、学习资源、编写测试和使用辅助库来适应。通过实践和学习,开发者能有效优化性能和响应速度。
众所周知
48 3
申公豹
|
4月前
|
设计模式 存储 算法
Python中的设计模式与最佳实践
【6月更文挑战第12天】```markdown 设计模式是软件开发中的标准解决方案,提升代码复用、可维护性。本文讨论了Python中的设计模式应用,如单例、工厂、观察者、策略、装饰器、原型、建造者、命令、状态、中介者和适配器模式。每个模式都有相应的Python示例,展示如何在实际编程中应用。适配器模式转换接口,外观模式简化复杂系统,两者都增强了代码的兼容性和易用性。设计模式是软件设计的重要工具,帮助解决常见问题,降低耦合度,提高系统灵活性。
申公豹
101 4
Python中的设计模式与最佳实践
好奇的菜鸟
|
4月前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
好奇的菜鸟
28 2

热门文章

最新文章

  • 1
    Python 中 \x00 和空字符串的区别,以及在 Django 中的坑
  • 2
    python模拟sed在每行添加##
  • 3
    python3 三级菜单-基础版
  • 4
    学python 对以后运维的工作很重要吗
  • 5
    Python使用二分插入排序竟然比直接插入排序快99倍!
  • 6
    python网络编程学习笔记(1)
  • 7
    python 之多线程加锁
  • 8
    【14】Python100例基础练习(1)
  • 9
    python2.6升级到2.7
  • 10
    Python树莓派编程1.2.1 SD卡
  • 1
    写出易维护的代码|React开发的设计模式及原则
    92
  • 2
    19:Web开发模式与MVC设计模式-Java Web
    86
  • 3
    18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
    89
  • 4
    JAVA设计模式之结构型模式
    58
  • 5
    【JavaScript 技术专栏】JavaScript 设计模式与实战应用
    68
  • 6
    【初学者慎入】Spring源码中的16种设计模式实现
    243
  • 7
    18个并发场景的设计模式详解,有没有你的盲区
    174
  • 8
    【设计模式学习】单例模式和工厂模式
    62
  • 9
    【PHP开发专栏】PHP设计模式解析与实践
    45
  • 10
    深入理解设计模式:单例模式的应用和实现
    130
  • 相关课程

    更多
  • Python Web开发基础
  • Python爬虫实战
  • Python常用数据科学库
  • Python网络爬虫实战
  • Python完全自学手册图文教程
  • Python基础快速入门实战教程
  • 相关电子书

    更多
  • From Python Scikit-Learn to Sc
  • Data Pre-Processing in Python:
  • 双剑合璧-Python和大数据计算平台的结合
  • 相关实验场景

    更多
  • 用Python画圣诞树
  • Python选择及循环结构
  • 云端Python及基本操作
  • Python网络通信程序典型应用
  • Python新手入门(Anolis OS)
  • Python新手入门
  • 推荐镜像

    更多
  • python-release
  • nodejs-release
  • golang
  • 下一篇
    AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片

    玻璃钢生产厂家晋中玻璃钢广场雕塑定制玻璃钢雕塑能用吗商业街雕塑圆球玻璃钢雕塑广西玻璃钢广场雕塑厂家批发福州景观玻璃钢雕塑生产厂家信阳泡沫玻璃钢人物雕塑厂家仙桃玻璃钢雕塑定做桂东玻璃钢花盆花器奉贤区知名玻璃钢雕塑价格商场室内美陈创意保山市玻璃钢雕塑公司山东户外玻璃钢雕塑定制玻璃钢花盆的耐久性大兴玻璃钢花盆厂家商丘专业玻璃钢仿铜雕塑玻璃钢雕塑虾黄山广场玻璃钢雕塑上海仿铜玻璃钢雕塑优势北京室内商场美陈研发玻璃钢人物雕塑厂家生产大型玻璃钢雕塑摆件研发公司深圳商场美陈装饰新款玻璃钢花盆生产厂家知名玻璃钢雕塑常用解决方案铜仁商场美陈造型蒙自市玻璃钢雕塑供应商玻璃钢雕塑的运输玻璃钢仿铜雕塑哪个好玻璃钢雕塑抬腿鹿玻璃钢花盆的材质香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

    玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化