当前位置: 首页 > news >正文

java设计模式:适配器模式

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

代码实现

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

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

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

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

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

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

4. 客户端代码

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. 运行结果

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

适配器模式的优越性体现

1. ​​解耦性​​ ✅

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

2. ​​复用性​​ ✅

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

3. ​​灵活性​​ ✅

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

public class USPowerAdapter implements DC5 {private AC110 ac110;public USPowerAdapter(AC110 ac110) {this.ac110 = ac110;}@Overridepublic int outputDC5V() {int input = ac110.outputAC110V();return input / 22;}
}

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

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

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

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

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

这种直接修改方式的缺点:
​​违反开闭原则​​:需要修改已测试通过的类
​​职责混杂​​:一个类承担多种功能
​​难以维护​​:随着需求变化,类会变得越来越复杂

http://www.dtcms.com/a/423082.html

相关文章:

  • 做微商网站制作迪虎科技网站建设
  • Cobalt Strike 学习笔记(1)
  • 学习React-20-useId
  • 掌中智汇,运筹帷幄 - 全新ASUS华硕智汇商擎小程序上线
  • 如何查询网站开发奔牛网络推广
  • 企业网站开发的功能百度seo优
  • 设计模式(C++)详解——备忘录模式(2)
  • 学习:uniapp全栈微信小程序vue3后台(30)
  • centos建设网站推广软文怎么写
  • 【开题答辩全过程】以 mac官网商城为例,包含答辩的问题和答案
  • mac基于mlx运行轻量级模型gemma-3-270m
  • 工业显示器在焊接机器人中的应用
  • uniapp 日历组件 uni-datetime-picker
  • 如何上传网站内容wordpress 文章导出
  • 【2小时轻松部署分布式存储Ceph高可用集群】2-ceph组件-Ceph 组件深度拆解:从底层架构到实战运维的全维度指南
  • 外链都没有的网站如何做排名的摄影设计说明范文
  • STM32H743-ARM例程13-SDIO
  • 求职招聘小程序:轻量化场景下的核心功能解析
  • 玳瑁的嵌入式日记---0929(ARM--ADC)
  • 国外seo做的好的网站wordpress 登陆
  • 东欣建设集团网站设计素材网站上的素材可以商用吗
  • OD C卷 - 有效子字符串
  • 无人机定点派送技术要点与运行方式
  • 实战项目:活动报名小程序-应用内数据库CRUD
  • 从零构建能自我优化的AI Agent:Reflection和Reflexion机制对比详解与实现
  • 能见度监测站的优点是什么
  • 网站建设需要代码哪些网站可以做国外生意
  • 建网站不想用怎样撤销有关于做茗茶的网站
  • PDDA-CY5用于制备荧光标记聚合物、纳米载体或功能化材料
  • 信息安全基础知识:10入侵检测技术