结构型 简单

适配器模式

Adapter Pattern

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

概述

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

适用场景

  • 当需要使用一个现有类,但其接口不符合需求时
  • 当需要创建一个可复用的类,该类可以与不相关或不可预见的类协同工作时
  • 当需要使用几个现有的子类,但不可能对每一个都进行子类化以匹配它们的接口时
  • 当需要统一多个不同接口的类时

优点

  • +单一职责原则:将接口转换代码与业务逻辑分离
  • +开闭原则:引入新类型的适配器时无需修改客户端代码
  • +提高类的复用性:可以让原本不兼容的类一起工作
  • +增加系统的灵活性和扩展性

缺点

  • 代码复杂度增加,需要引入额外的适配器类
  • 有时直接修改服务类可能更简单
  • 过度使用可能导致系统结构混乱

结构

classDiagram class Target { <<interface>> +request() } class Adaptee { +specificRequest() } class Adapter { -adaptee: Adaptee +request() } class ClassAdapter { +request() } class Client { +main() } Target <|.. Adapter : implements Target <|-- ClassAdapter : extends/implements ClassAdapter --|> Adaptee : extends Adapter --> Adaptee : adapts Client ..> Target : uses style Target fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style Adaptee fill:#fff3e0,stroke:#f57c00,stroke-width:2px style Adapter fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style ClassAdapter fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

适配器转换接口
Clientexpects
TargetInterface
Adapterconverts
Adapteeexisting

点击适配器激活接口转换

生活类比

适配器就像是电源转换插头或转接头

电源转换插头

出国旅行时,你需要一个转换插头来让你的电器适应当地的插座。适配器模式也是如此,它让接口不兼容的类能够协同工作。

读卡器

笔记本电脑通常没有直接读取 SD 卡的接口,需要使用读卡器作为适配器,将 SD 卡的接口转换为 USB 接口。

翻译官

两个说不同语言的人交流时,需要翻译官作为适配器,将一种语言转换为另一种语言。

代码实现

Example.java

实际应用

Java IO - InputStreamReader

Java IO 中的 InputStreamReader 和 OutputStreamWriter 是适配器的典型例子,将字节流适配为字符流。

Example.java

Android - ListView Adapter

Android 开发中的 Adapter 模式用于将数据适配到 ListView、RecyclerView 等视图组件。

Example.java

Spring MVC - HandlerAdapter

Spring MVC 中的 HandlerAdapter 将不同类型的 Controller 适配到统一的处理流程。

Example.java

练习

1

适配器模式的主要目的是什么?

2

对象适配器和类适配器的主要区别是什么?

3

适配器模式符合开闭原则,可以在不修改现有代码的情况下引入新的适配器。

4

以下哪种情况不适合使用适配器模式?