适配器模式详解和实现(设计模式 四)

适配器模式将一个类的接口转换成客户端所期望的另一个接口,解决由于接口不兼容而无法进行合作的问题。

设计基本步骤

  1. 创建目标接口(Target Interface),该接口定义了客户端所期望的方法。

2.创建被适配类(Adaptee Class),该类是需要被适配的类,它包含了一些已经存在的方法。

  1. 创建适配器类(Adapter Class),该类实现了目标接口,并包含被适配对象的引用。

  2. 在适配器类中实现目标接口的方法,并在方法内部调用被适配类的方法。

实例介绍运用

假设我们正在开发一个电子支付业务,该系统需要与不同的支付服务提供商进行集成(支付宝、微信支付和银联支付),每个支付服务提供商都有自己的接口和方法来处理支付请求,我们希望将支付服务提供商的接口适配成了统一的支付接口(转换),我们可以使用适配器模式实现,这样三种支付方式我们都能同时处理。

  1. 创建目标接口

    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");
    }
}
  1. 创建适配器类、实现方法

    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);
    }
}
相关推荐
l1564694823 分钟前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
IT小盘1 小时前
05-企业项目统一接入多个大模型-适配器模式实战
前端·人工智能·适配器模式
布吉岛的石头1 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123452 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw2 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A12 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity3 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy3 小时前
23-Java 构造函数
java·后端
坚持的小马3 小时前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq
砚底藏山河3 小时前
多家股票数据接口对比、企业级股票数据API
java·python·金融·maven