适配器模式将一个类的接口转换成客户端所期望的另一个接口,解决由于接口不兼容而无法进行合作的问题。
设计基本步骤
- 创建目标接口(Target Interface),该接口定义了客户端所期望的方法。
2.创建被适配类(Adaptee Class),该类是需要被适配的类,它包含了一些已经存在的方法。
-
创建适配器类(Adapter Class),该类实现了目标接口,并包含被适配对象的引用。
-
在适配器类中实现目标接口的方法,并在方法内部调用被适配类的方法。
实例介绍运用
假设我们正在开发一个电子支付业务,该系统需要与不同的支付服务提供商进行集成(支付宝、微信支付和银联支付),每个支付服务提供商都有自己的接口和方法来处理支付请求,我们希望将支付服务提供商的接口适配成了统一的支付接口(转换),我们可以使用适配器模式实现,这样三种支付方式我们都能同时处理。
-
创建目标接口
public interface PaymentService {
void pay(String paymentType, double amount);
}
2.创建被适配类
public class AlipayService implements PaymentService {//支付宝支付
@Override
public void pay(String paymentType, double amount) {
System.out.println("Alipay payment: " + amount + " CNY");
}
}
public class WechatPayService implements PaymentService {//微信支付
@Override
public void pay(String paymentType, double amount) {
System.out.println("WeChat payment: " + amount + " CNY");
}
}
public class UnionPayService implements PaymentService {//银联支付
@Override
public void pay(String paymentType, double amount) {
System.out.println("UnionPay payment: " + amount + " CNY");
}
}
-
创建适配器类、实现方法
public class PaymentAdapter implements PaymentService {
//被适配对象引用
private AlipayService alipayService;
private WechatPayService wechatPayService;
private UnionPayService unionPayService;//初始化 public PaymentAdapter() { alipayService = new AlipayService(); wechatPayService = new WechatPayService(); unionPayService = new UnionPayService(); } @Override public void pay(String paymentType, double amount) {//实现统一支付逻辑 if (paymentType.equalsIgnoreCase("Alipay")) { alipayService.pay(paymentType, amount); } else if (paymentType.equalsIgnoreCase("WeChatPay")) { wechatPayService.pay(paymentType, amount); } else if (paymentType.equalsIgnoreCase("UnionPay")) { unionPayService.pay(paymentType, amount); } else { //其他方式不支持 System.out.println("Unsupported payment type: " + paymentType); } }
}
4.客户端简单实现
public class Main {
public static void main(String[] args) {
PaymentService paymentService = new PaymentAdapter();
paymentService.pay("Alipay", 10000.0);
paymentService.pay("WeChatPay", 20000.0);
paymentService.pay("UnionPay", 30000.0);
paymentService.pay("ApplePay", 500.0);
}
}