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

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

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

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

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

相关推荐
秋天的怀念_David4 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源5 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David5 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122665 小时前
网络编程^
java
Thinker QAQ6 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
齐 飞6 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色6 小时前
多AS互联BGP4综合实验设计
java
某不知名網友7 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog7 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程7 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring