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

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

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

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

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

相关推荐
我命由我123454 小时前
Android 开发 - Android JNI 开发关键要点
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
YG亲测源码屋4 小时前
怎么让自己的网址被百度收录(网站如何被百度收录进去)
java·百度·dubbo
风筝在晴天搁浅4 小时前
代码随想录 Q89.跳跃游戏Ⅱ
java
tryxr5 小时前
变量捕获相关内容
java·开发语言·jvm
拉不动的猪5 小时前
Token无感刷新全流程(Vue + Axios + Node.js(Express))
java·javascript·vue.js
m0_639817155 小时前
基于springboot个人云盘管理系统【带源码和文档】
java·spring boot·后端
大头an5 小时前
Spring事务隔离级别全解析:从读未提交到序列化
java
将编程培养成爱好5 小时前
C++ 设计模式《账本事故:当备份被删光那天》
开发语言·c++·设计模式·备忘录模式
大隐隐于野6 小时前
从零开始理解和编写LLM中的KV缓存
java·缓存·llm
DKunYu6 小时前
1.多线程初阶
java·开发语言