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 {@Overridepublic 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;}@Overridepublic 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 {@Overridepublic void methodA() {}@Overridepublic void methodB() {}@Overridepublic void methodC() {}
}// 3. 具体适配器(只实现 methodA)
class ConcreteAdapter extends AbstractAdapter {@Overridepublic 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 设计模式中最常见的模式之一,主要用于接口不兼容的情况。在不同场景下,选择合适的适配器模式可以提高代码复用性,减少修改成本,符合开闭原则。