AI速览:适配器模式通过“转接头”机制(如对象适配器或类适配器)将一个类的接口转换为另一个接口,解决新旧系统或组件间的兼容问题(如USB-A转USB-C),核心是复用旧代码(如Banner类)而不修改其实现,客户端仅依赖目标接口(如Print),但可能增加代码层级。典型应用包括Java I/O适配器、Android列表数据绑定,本质是“接口翻译官”。

设计模式笔记:Adapter模式(适配器模式)

什么是适配器模式?

想象你有一个USB-C接口的电脑,但手头只有USB-A的U盘。这时你需要一个转接头,让旧设备能兼容新接口。适配器模式就是这个“转接头”——它将一个类的接口转换成另一个接口,使得原本不兼容的类可以协同工作。


为什么需要它?

  • 解决接口不兼容:比如新旧系统对接时,无需修改已有代码。
  • 复用遗留代码:将老旧功能包装成新接口供新系统使用。
  • 灵活扩展:适配器可以同时兼容多个不同的类。

Java代码示例

假设有一个已存在的Banner类(需要被适配),但客户端期望通过Print接口调用打印功能,用适配器模式实现兼容:

1. 被适配的类:Banner(已存在,但接口不兼容)
1
2
3
4
5
6
7
8
9
10
public class Banner {
// 旧系统的打印方法
public void showWithParen(String text) {
System.out.println("(" + text + ")");
}

public void showWithAster(String text) {
System.out.println("*" + text + "*");
}
}
2. 目标接口:Print(客户端期望的接口)
1
2
3
4
public interface Print {
void printWeak(String text); // 弱化格式打印
void printStrong(String text); // 强调格式打印
}
3. 适配器类:PrintBanner(连接Banner和Print)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class PrintBanner implements Print {
private Banner banner; // 持有一个被适配对象的引用

public PrintBanner() {
this.banner = new Banner(); // 组合方式实现适配(对象适配器)
}

@Override
public void printWeak(String text) {
// 将printWeak委托给Banner的showWithParen
banner.showWithParen(text);
}

@Override
public void printStrong(String text) {
// 将printStrong委托给Banner的showWithAster
banner.showWithAster(text);
}
}
4. 客户端使用
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Print print = new PrintBanner(); // 客户端只依赖Print接口
print.printWeak("Hello"); // 输出:(Hello)
print.printStrong("World"); // 输出:*World*
}
}

适配器模式的核心

  • 目标接口(Print):定义客户端需要的规范。
  • 被适配者(Banner):已存在的类,但接口不匹配。
  • 适配器(PrintBanner):实现目标接口,并内部调用被适配者的方法。

实际应用

  • Java I/OInputStreamReaderInputStream适配到Reader接口。
  • Android开发RecyclerView.Adapter将数据适配到列表视图。
  • 旧系统整合:将数据库JDBC接口适配到新的ORM框架。

优缺点

优点

  • 复用旧代码:无需修改原有类即可接入新系统。
  • 灵活解耦:客户端只依赖接口,不关心具体实现。

缺点

  • 增加复杂性:过多适配器会让代码难以理解。
  • 性能损耗:多层转发可能影响效率(通常可忽略)。

类适配器 vs 对象适配器

  • 对象适配器(本例采用):通过组合实现,更灵活(可适配多个类)。
  • 类适配器:通过继承实现(Java中需多继承,但Java不支持,因此不常用)。

一句话总结

适配器模式是“万能转接头”——让新旧世界握手言和!