设计模式详解(六):适配器模式——Adapter

适配器模式及其作用

适配器模式是一种结构型设计模式。所谓结构型是指在代码结构方面的设计模式。适配器模式作为中间层,可以让交互接口不兼容的两个类或模块间正常交互协作。双方只面向适配器工作,无需关心适配器的另一端是谁及其工作方式。

现实生活举例

苹果电脑是没有USB插孔的,如果想要连接USB插头的设备,必须使用适配器。对于苹果电脑来说,与满足自身接口协议的适配器交互,不知道也不关心在适配器的另一端的设备的交互协议是怎样的。对于USB设备来说,只与适配器的USB插口交互,同样也不关心另一端的情况。在这里插入图片描述

适配器模式的好处

  • 可以让接口不兼容的两个模块交互。当交互的双方接口不兼容时,如果不愿修改已有代码的功能,因为变更意味着风险,可能引入bug,另外,有可能根本没有权限修改,比如一方是第三方类库。此时使用适配器模式,可以让双方无缝对接。
  • 单一职责。交互的双方专注于自己的主责,将交互设计与数据转换分离到Adapter中。

适配器模式的实现

关系图

交互主动方称为Client,交互被动方称为Service。
在这里插入图片描述

实现步骤

  1. 根据交互主动方Client所要求的交互方式和数据格式,声明Adapter接口,定义一组交互方法。
  2. 定义一个Adapter类,内部持有一个Service对象,所有的交互方法基于Service的功能实现。
  3. Client内部持有一个成员变量,类型为Adapter接口类型,可接收任何遵循Adapter接口的对象。
  4. 当不同的Service想提供服务时,创建新的Adapter接口实现类,基于该Service,遵循Adapter接口实现服务功能。

适配器模式的适用场景

  • 想要接口不兼容的两方交互,而不用修改两方的代码。可以使用适配器作为中间者,建立沟通的桥梁
  • 设计一个工具类或功能模块,根本无法预知交互方的交互方式及数据格式,但自身的工作流程及依赖功能已知,此时可将依赖的功能抽象成适配器接口,完成自己的实现。想要与之沟通的类或模块,创建遵循该适配器接口的适配器,提供相应功能。

适配器模式示例

Android中,RecyclerView便使用了适配器模式。RecyclerView作为UI组件,只负责展示数据,至于数据的来源,获取方式(如数据库、网络、内存),完全不关心,也无法预知。所以定义了获取数据的Adapter接口,想要为Recycler提供数据,需定义一个类,实现Adapter接口,提供展示的数据。

相关推荐

  1. 设计模式-适配器模式 Adapter

    2024-06-06 20:18:02       48 阅读
  2. 设计模式——适配器模式Adapter

    2024-06-06 20:18:02       34 阅读
  3. .NET 设计模式适配器模式Adapter Pattern)

    2024-06-06 20:18:02       47 阅读
  4. 设计模式适配器模式Adapter Pattern)

    2024-06-06 20:18:02       35 阅读
  5. 设计模式】8、adapter 适配器模式

    2024-06-06 20:18:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 20:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 20:18:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 20:18:02       82 阅读
  4. Python语言-面向对象

    2024-06-06 20:18:02       91 阅读

热门阅读

  1. AI绘图工具最全汇总--你适合哪一款

    2024-06-06 20:18:02       29 阅读
  2. Go 发送邮件的两种方式

    2024-06-06 20:18:02       28 阅读
  3. JZ2440笔记:rtc驱动

    2024-06-06 20:18:02       30 阅读
  4. 运用selenium爬取京东商品数据储存到MySQL数据库中

    2024-06-06 20:18:02       35 阅读
  5. 作业6.6

    作业6.6

    2024-06-06 20:18:02      32 阅读
  6. SpringBoot默认配置文件

    2024-06-06 20:18:02       22 阅读
  7. PyQt5学习系列之ui转py后的使用

    2024-06-06 20:18:02       30 阅读
  8. mysql 里面有rowid吗

    2024-06-06 20:18:02       22 阅读
  9. mysql多启动

    2024-06-06 20:18:02       26 阅读
  10. cuda编程学习:写cuda程序的基本流程

    2024-06-06 20:18:02       33 阅读
  11. 富格林:谨慎欺诈套路防止被骗

    2024-06-06 20:18:02       26 阅读
  12. C++STL---list模拟实现

    2024-06-06 20:18:02       22 阅读