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

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

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

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

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

相关推荐
daidaidaiyu2 小时前
一文学习 工作流开发 BPMN、 Flowable
java
SuniaWang3 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
sheji34163 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
m0_726965984 小时前
面面面,面面(1)
java·开发语言
xuhaoyu_cpp_java4 小时前
过滤器与监听器学习
java·经验分享·笔记·学习
程序员小假5 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha5 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34165 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
木井巳6 小时前
【递归算法】子集
java·算法·leetcode·决策树·深度优先