1.适配器模式

news/2025/2/25 9:18:22

概述

适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。

适配器模式在业务场景中非常有用,尤其是在系统集成、接口兼容性处理以及代码复用等场景。以下是一个实际的业务场景示例:


业务场景:支付系统集成

假设你正在开发一个电商平台,需要集成多个第三方支付网关(如支付宝、微信支付、银联支付等)。每个支付网关的接口设计不同,但你的系统希望统一调用一个支付接口来处理所有支付请求。


1. 目标接口(统一的支付接口)

public interface PaymentGateway {
    void pay(double amount);
}

2. 需要适配的第三方支付类

支付宝支付
public class Alipay {
    public void alipayPayment(double amount) {
        System.out.println("支付宝支付:支付金额 " + amount);
    }
}
微信支付
public class WechatPay {
    public void wechatPayment(double amount) {
        System.out.println("微信支付:支付金额 " + amount);
    }
}

3. 适配器类

支付宝适配器
public class AlipayAdapter implements PaymentGateway {
    private Alipay alipay;

    public AlipayAdapter(Alipay alipay) {
        this.alipay = alipay;
    }

    @Override
    public void pay(double amount) {
        alipay.alipayPayment(amount); // 调用支付宝的支付方法
    }
}
微信支付适配器
public class WechatPayAdapter implements PaymentGateway {
    private WechatPay wechatPay;

    public WechatPayAdapter(WechatPay wechatPay) {
        this.wechatPay = wechatPay;
    }

    @Override
    public void pay(double amount) {
        wechatPay.wechatPayment(amount); // 调用微信支付的支付方法
    }
}

4. 客户端代码

public class PaymentSystem {
    public static void main(String[] args) {
        // 创建支付宝适配器
        PaymentGateway alipayGateway = new AlipayAdapter(new Alipay());
        alipayGateway.pay(100.0); // 调用统一的支付接口

        // 创建微信支付适配器
        PaymentGateway wechatGateway = new WechatPayAdapter(new WechatPay());
        wechatGateway.pay(200.0); // 调用统一的支付接口
    }
}

5. 输出

复制

支付宝支付:支付金额 100.0
微信支付:支付金额 200.0

业务场景总结

  1. 问题:第三方支付接口设计不一致,导致系统无法统一调用。

  2. 解决方案:使用适配器模式,为每个第三方支付接口创建一个适配器,将它们的接口转换为统一的 PaymentGateway 接口。

  3. 优点

    • 系统与第三方支付接口解耦,便于扩展新的支付方式。

    • 客户端代码只需调用统一的 PaymentGateway 接口,无需关心具体支付实现。

    • 符合开闭原则,新增支付方式时只需增加适配器,无需修改现有代码。


其他业务场景

  1. 日志系统集成:将不同日志框架(如 Log4j、SLF4J)适配到统一的日志接口。

  2. 数据格式转换:将不同数据格式(如 XML、JSON)转换为系统需要的格式。

  3. 旧系统升级:在新系统中复用旧系统的功能,通过适配器兼容旧接口。

适配器模式的核心思想是兼容性,它帮助我们在不修改现有代码的情况下,实现不同接口的协同工作。


http://www.niftyadmin.cn/n/5865309.html

相关文章

【Rust中级教程】2.9. API设计原则之显然性(obvious) :文档与类型系统、语义化类型、使用“零大小”类型

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 2.9.1. 文档与类型系统 用户可能不会完全理解API的所有规则和限制。所以你写的API应该让你…

双指针1:283. 移动零

双指针的基本思想: 首先根据异地操作确定指针的基本步骤,再将异地操作优化成原地操作的双指针解法 链接:283. 移动零 - 力扣(LeetCode) 题解: 异地操作:fast指针指向原数组,slow指…

tableau之人口金字塔、漏斗图、箱线图

一、人口金字塔 人口金字塔在本质上就是成对的条形图 人口金字塔是一种特殊的旋风图 1、数据处理 对异常数据进行处理 2、创建人口金字塔图 将年龄进行分桶 将男女人数数据隔离开 分别绘制两个条形图 双击男性条形图底部,将数据进行翻转(倒序&a…

本周行情——250222

本周A股行情展望与策略 结合近期盘面特征及市场主线演化,本周A股预计延续结构性分化行情,科技成长与政策催化板块仍是资金主战场,但需警惕高标股分歧带来的波动。以下是具体分析与策略建议: 1. 行情核心驱动因素 主线延续性&…

JavaScript系列(86)--现代构建工具详解

JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…

C语言堆学习笔记

1. 堆的定义 堆(Heap)是一种特殊的树形数据结构,它满足以下性质: 堆是一个完全二叉树。堆中每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。 1.1 最大堆 在…

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

鸿蒙ArkTS页面如何与H5页面交互?

鸿蒙页面如何与H5页面交互&#xff1f; 先看效果前言通信功能介绍Web组件使用问题 Harmony OS NEXT版本&#xff08;接口及解决方案兼容API12版本或以上版本) 先看效果 功能介绍 点击Click Me按钮可以接收展示鸿蒙传递给html的内容点击霓虹灯按钮可以同步更新底部鸿蒙页面的按…