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;
    }
}

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

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

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

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

相关推荐
帧栈几秒前
并发编程原理与实战(三十九)并发基石ArrayBlockingQueue与LinkedBlockingQueue的底层实现与API设计解析
java
一辉ComeOn2 分钟前
【大数据高并发核心场景实战】缓存层 - 写缓存
java·大数据·redis·缓存
洲星河ZXH3 分钟前
Java,String类
java·开发语言
青衫码上行4 分钟前
【JavaWeb 学习 | 第16篇】JPS介绍和基本语法
java·学习·web·jsp
nono牛5 分钟前
C++ 语言全面教程 (基础入门)
java·jvm·c++
冬夜戏雪5 分钟前
【Java学习日记】【2025.12.2】【2/60】
java·开发语言·学习
小年糕是糕手8 分钟前
【C++同步练习】类和对象(一)
java·开发语言·javascript·数据结构·c++·算法·排序算法
Zzzzzxl_9 分钟前
深入理解Java JVM中的垃圾回收器
java·jvm·编程·性能调优·垃圾回收
小年糕是糕手9 分钟前
【C++同步练习】类和对象(二)
java·开发语言·javascript·数据结构·c++·算法·ecmascript
shan&cen13 分钟前
内网穿透(FRP)部署小结,服务器上xxl-job 调度本机任务
java·服务器