七.适配器模式

一.定义

适配器模式(Adapter Pattern)充当两个不兼容接口之间的桥梁,属于结构型设计模式。它通过一个中间件(适配器)将一个类的接口转换成客户期望的另一个接口,使原本不能一起工作的类能够协同工作。

1.1.通俗解释

当前项目要开发一个新的模块,你发现旧模块中有个接口的实现类刚好好符合当前的业务逻辑。但是方法签名却不符合。

比如:旧模块的方法传入的是List<String>,而功能传入的却是String,于是创建一个新接口,在新接口的实现类中调用旧接口实现类的方法。这就是适配器模式。方法签名或返回值不兼容,但其内部的业务逻辑刚好使用,由于旧方法在使用中,不能修改,于是二次分装。

1.2.接口+适配器模式的优势

至于为什么要用接口,而不是直接使用类调用旧方法呢?接口有很多优点,以下是其中几个。

1.2.1.支持多实现(策略灵活)

通过定义新接口,可以支持多种实现方式,可以写多个适配器或实现类,这样就可以在运行时动态切换不同的实现。

1.2.2.提高解耦能力(面向接口编程)

如果直接 new NewClass() 来调用,如果以后想换一种实现方式,就得改代码。如果使用接口,随时更换实现,无需修改调用方。

1.2.3.支持扩展开放/关闭原则

对扩展开放,对修改关闭。

如果是小型项目或临时脚本,不需要扩展或替换实现,快速验证逻辑,不考虑长期维护,也可以直接创建适配器类,

二.案例

java 复制代码
/**
 * 第三方支付平台接口(需要被适配)
 */
public interface ThirdPartyPayment {
    void processPayment(String currency, double amount);
}
/**
 * 第三方支付实现类
 */
public class ThirdPartyPaymentImpl implements ThirdPartyPayment {
    @Override
    public void processPayment(String currency, double amount) {
        System.out.println("支付宝: " + amount + " " + currency);
    }
}

/**
 * 本地支付接口定义(适配接口)
 */
public interface Payment {
    void pay(double amount);
}

/**
 * 支付适配器类,将第三方支付接口适配成本地系统兼容的形式
 */
public class PaymentAdapter implements Payment {
    private ThirdPartyPayment thirdPartyPayment;
    private String currency;

    public PaymentAdapter(ThirdPartyPayment payment, String currency) {
        this.thirdPartyPayment = payment;
        this.currency = currency;
    }

    @Override
    public void pay(double amount) {
        // 适配逻辑:将一个参数方法转换为带参数的第三方支付调用
        thirdPartyPayment.processPayment(currency, amount);
        System.out.println("支付适配器已处理金额: " + amount + " " + currency);
    }
}

    /**
     * 测试适配器模式的使用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 使用适配器包装第三方支付
        Payment payment = new PaymentAdapter(new ThirdPartyPaymentImpl(), "CNY");
        // 通过统一接口进行支付
        payment.pay(199.9);
    }

运行结果:

支付宝: 199.9 CNY

支付适配器已处理金额: 199.9 CNY

💡 如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我

🔔 完整的23中设计模式干货,第一时间推送给你!

🔔 有什么问题也可以在评论区讨论🤝🤝🤝

相关推荐
JAVA面经实录9175 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
许彰午7 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U8 小时前
JavaEE|多线程初阶(七)
java·开发语言
掌心向暖RPA自动化10 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭10 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
TeamDev11 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
geovindu12 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
AI人工智能+电脑小能手12 小时前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试
likerhood12 小时前
SLF4J: Failed to load class “StaticLoggerBinder“ 解决
java·log4j·maven