介绍
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间进行协作。通过使用适配器模式,可以将一个类的接口转换成客户期望的另一个接口,从而使原本由于接口不兼容而不能一起工作的类可以协同工作。
两种类型
- 类适配器模式:使用继承的方式进行适配。
- 对象适配器模式:使用组合的方式进行适配。
结构
- 目标接口(Target):客户端期望的接口。
- 适配者(Adaptee):需要适配的接口。
- 适配器(Adapter):将适配者转换为目标接口的类。
应用场景
- 接口转换:当系统中有多个类的接口不兼容但需要协同工作时,可以使用适配器模式。
- 复用现有类:当希望复用一些现有的类,但接口不符合要求时,可以使用适配器模式。
- 统一接口:当需要创建一个统一的接口来表示一组不兼容的接口时,可以使用适配器模式。
Java实现示例
一个老的支付系统,提供了LegacyPayment
接口,而我们现在希望使用一个新的支付接口ModernPayment
。我们可以使用适配器模式来适配旧的接口,使其符合新的接口要求。
// 旧的支付接口
public interface LegacyPayment {
void makePayment(double amount);
}
// 旧的支付接口实现
public class LegacyPaymentImpl implements LegacyPayment {
@Override
public void makePayment(double amount) {
System.out.println("Payment made using legacy system: $" + amount);
}
}
// 新的支付接口
public interface ModernPayment {
void pay(double amount);
}
// 类适配器
public class PaymentAdapter extends LegacyPaymentImpl implements ModernPayment {
@Override
public void pay(double amount) {
makePayment(amount); // 调用旧的支付系统方法
}
}
// 对象适配器
public class PaymentAdapter implements ModernPayment {
private LegacyPayment legacyPayment;
public PaymentAdapter(LegacyPayment legacyPayment) {
this.legacyPayment = legacyPayment;
}
@Override
public void pay(double amount) {
legacyPayment.makePayment(amount); // 调用旧的支付系统方法
}
}
public class AdapterPatternDemo {
public static void main(String[] args) {
// 使用类适配器
ModernPayment modernPayment1 = new PaymentAdapter();
modernPayment1.pay(100.0);
// 使用对象适配器
LegacyPayment legacyPayment = new LegacyPaymentImpl();
ModernPayment modernPayment2 = new PaymentAdapter(legacyPayment);
modernPayment2.pay(200.0);
}
}
Spring中使用场景
在Spring框架中,适配器模式被广泛应用。例如,Spring MVC中的HandlerAdapter
接口就是适配器模式的一个典型应用。
Spring MVC中的HandlerAdapter
在Spring MVC中,HandlerAdapter
用于将不同类型的处理器适配为统一的接口。Spring MVC允许开发者使用各种不同类型的处理器(如Controller接口、注解控制器等),通过HandlerAdapter,Spring MVC可以统一处理这些不同类型的处理器。
总结
适配器模式是一个非常有用的设计模式,它能够使接口不兼容的类协同工作,增加代码的复用性和灵活性。通过适配器模式,可以在不修改现有类的情况下,扩展系统的功能。
在Java中,适配器模式广泛应用于各类框架和库中,例如Java的java.util.Arrays
类中的asList
方法就使用了适配器模式将数组适配为List
接口。Spring框架中的HandlerAdapter也是适配器模式的一个典型应用,通过HandlerAdapter,Spring MVC可以统一处理各种不同类型的处理器。通过理解和应用适配器模式,可以有效地解决实际开发中接口不兼容的问题,提升系统的可维护性和可扩展性。