java设计模式:适配器模式

场景描述:电源电压转换

假设我们有一个220V交流电源(现有类),但客户端需要5V直流电(目标接口)。适配器模式可以帮助我们实现电压转换而不修改现有代码。

代码实现

1. 目标接口(5V直流电)

java 复制代码
// 目标接口:客户端期望的5V直流电
public interface DC5 {
    int outputDC5V();
}

2. 被适配类(220V交流电)

java 复制代码
// 被适配者:已存在的220V交流电类
public class AC220 {
    public int outputAC220V() {
        int output = 220;
        System.out.println("输出交流电:" + output + "V");
        return output;
    }
}

3. 适配器类(对象适配器实现)

java 复制代码
// 对象适配器:通过组合方式实现
public class PowerAdapter implements DC5 {
    private AC220 ac220;
    
    public PowerAdapter(AC220 ac220) {
        this.ac220 = ac220;
    }
    
    @Override
    public int outputDC5V() {
        int input = ac220.outputAC220V();
        // 电压转换:220V交流电转为5V直流电
        int output = input / 44;
        System.out.println("适配器工作:将" + input + "V交流电转换为" + output + "V直流电");
        return output;
    }
}

4. 客户端代码

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 现有的220V交流电源
        AC220 ac220 = new AC220();
        
        // 创建适配器,将220V交流电适配为5V直流电
        DC5 powerAdapter = new PowerAdapter(ac220);
        
        // 客户端使用统一的5V接口
        System.out.println("获得直流电压:" + powerAdapter.outputDC5V() + "V");
    }
}

5. 运行结果

md 复制代码
输出交流电:220V
适配器工作:将220V交流电转换为5V直流电
获得直流电压:5V

适配器模式的优越性体现

1. ​​解耦性​​ ✅

客户端只依赖DC5接口,完全不知道AC220类的存在。如果电压转换逻辑需要修改,只需调整适配器类,客户端代码无需变动。

2. ​​复用性​​ ✅

现有的AC220类可以继续在原有系统中使用,同时通过适配器在新系统中重用,避免了代码重复。

3. ​​灵活性​​ ✅

可以轻松扩展新的适配器。比如增加一个将110V转换为5V的适配器:

java 复制代码
public class USPowerAdapter implements DC5 {
    private AC110 ac110;
    
    public USPowerAdapter(AC110 ac110) {
        this.ac110 = ac110;
    }
    
    @Override
    public int outputDC5V() {
        int input = ac110.outputAC110V();
        return input / 22;
    }
}

客户端使用方式不变,符合开闭原则。

4. ​​兼容旧系统​​ ✅

在系统升级或集成第三方库时特别有用。例如,JDBC驱动就是适配器模式的典型应用,它将不同数据库的接口适配为统一的JDBC接口。

对比:没有使用适配器模式的问题
如果直接修改AC220类来支持5V输出:

java 复制代码
// 不推荐的做法:修改原有类
public class AC220 {
    public int outputAC220V() { /* ... */ }
    
    // 新增方法:破坏类的单一职责原则
    public int outputDC5V() {
        return outputAC220V() / 44;
    }
}

这种直接修改 方式的缺点:

​​违反开闭原则​​:需要修改已测试通过的类

​​职责混杂​​:一个类承担多种功能

​​难以维护​​:随着需求变化,类会变得越来越复杂

相关推荐
码匠许师傅6 分钟前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
workflower24 分钟前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
QCodingDev27 分钟前
Spring AI Alibaba ReAct Agent实战:从Tool Calling到Agent,企业AI复杂业务该如何设计?
java·人工智能·agent·ai编程·spring ai
RainCity39 分钟前
Java Swing 自定义组件库分享(十六)
java·笔记·后端
赵广陆2 小时前
企业实战:Markdown图片检索
android·java·开发语言
C++、Java和Python的菜鸟2 小时前
第3章 从0开始用若依
java·开发语言
Json____2 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
counting money4 小时前
Spring AI Alibaba 从入门到实战:构建企业级 AI 应用
java·人工智能·spring
原野池予4 小时前
深入Java集合框架:数组与List互转底层原理剖析(JDK 8)
java·数据结构·list
Java成神之路-4 小时前
深入理解 HashMap 扩容时机:JDK 7 vs JDK 8 的设计差异与取舍
java·juc