Java 设计模式之适配器模式教程
1. 适配器模式简介
1.1 什么是适配器模式?
适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的接口,使原本因接口不匹配而无法一起工作的类能够协同工作。
1.2 适用场景
复用现有类,但接口不兼容
使用第三方库,但方法不匹配
统一多个类的接口
2. 适配器模式的三种实现方式
适配器模式有三种常见实现方式:
类适配器模式(基于继承)
对象适配器模式(基于组合)
接口适配器模式(基于抽象类)
3. 类适配器模式
3.1 结构
Target(目标接口):客户端期望使用的接口
Adaptee(被适配者):已有的不兼容接口
Adapter(适配器):继承 Adaptee 并实现 Target,进行接口转换
3.2 UML 图
┌───────────┐
│ Target │ (目标接口)
└───────────┘
▲
│
┌───────────┐
│ Adapter │ (适配器)
└───────────┘
▲
│
┌───────────┐
│ Adaptee │ (被适配者)
└───────────┘
3.3 代码示例
// 1. 目标接口(客户端期望的接口)
interface Target {
void request();
}
// 2. 被适配者(已有类,接口不兼容)
class Adaptee {
void specificRequest() {
System.out.println("被适配者的方法调用");
}
}
// 3. 适配器(继承 Adaptee 并实现 Target)
class Adapter extends Adaptee implements Target {
@Override
public void request() {
specificRequest(); // 适配器将 request() 映射到 specificRequest()
}
}
// 4. 客户端
public class ClassAdapterDemo {
public static void main(String[] args) {
Target target = new Adapter(); // 使用适配器
target.request(); // 输出:被适配者的方法调用
}
}
3.4 适用场景
✅ 适用于:适配器和被适配者是同一类层级,因为适配器需要继承被适配者。
❌ 缺点:无法适配多个类,因为 Java 不支持多继承。
4. 对象适配器模式
4.1 结构
对象适配器模式采用 组合(而不是继承),适配器持有 Adaptee 的实例,从而调用其方法。
4.2 UML 图
┌───────────┐
│ Target │ (目标接口)
└───────────┘
▲
│
┌───────────┐
│ Adapter │ (适配器)
└───────────┘
│
┌──────┴──────┐
│ Adaptee │ (被适配者)
└─────────────┘
4.3 代码示例
// 1. 目标接口(客户端期望的接口)
interface Target {
void request();
}
// 2. 被适配者(已有类,接口不兼容)
class Adaptee {
void specificRequest() {
System.out.println("被适配者的方法调用");
}
}
// 3. 适配器(对象适配器,使用组合方式)
class ObjectAdapter implements Target {
private final Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest(); // 委托给被适配者的方法
}
}
// 4. 客户端
public class ObjectAdapterDemo {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee); // 适配器
target.request(); // 输出:被适配者的方法调用
}
}
4.4 适用场景
✅ 适用于:希望适配多个不同的类(组合可以支持多个 Adaptee)。
✅ 优点:不需要修改 Adaptee 代码,更符合开闭原则。
❌ 缺点:比类适配器稍复杂,需要额外创建适配器实例。
5. 接口适配器模式
5.1 结构
接口适配器模式适用于接口有多个方法,但子类只需实现部分方法。通过抽象类提供默认实现,子类只需覆盖需要的方法。
5.2 代码示例
// 1. 目标接口(含多个方法)
interface MultiTarget {
void methodA();
void methodB();
void methodC();
}
// 2. 抽象适配器(提供默认实现)
abstract class AbstractAdapter implements MultiTarget {
@Override
public void methodA() {}
@Override
public void methodB() {}
@Override
public void methodC() {}
}
// 3. 具体适配器(只实现 methodA)
class ConcreteAdapter extends AbstractAdapter {
@Override
public void methodA() {
System.out.println("实现 methodA");
}
}
// 4. 客户端
public class InterfaceAdapterDemo {
public static void main(String[] args) {
MultiTarget target = new ConcreteAdapter();
target.methodA(); // 输出:实现 methodA
}
}
5.3 适用场景
✅ 适用于:接口有多个方法,但子类只需实现部分。
✅ 优点:避免子类必须实现所有方法,提高灵活性。
❌ 缺点:适用于接口较大的场景,如果接口方法较少,直接实现即可。
6. 适配器模式总结
7. 总结
适配器模式是 Java 设计模式中最常见的模式之一,主要用于接口不兼容的情况。在不同场景下,选择合适的适配器模式可以提高代码复用性,减少修改成本,符合开闭原则。