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

软件设计模式-适配器模式

适配器模式

意图:将一个类的接口转换成客户希望的另外一个接口。

例子:读卡器是内存卡和笔记本USB接口之间的适配器。

适配器模式示例:读卡器模拟

demo1:

// 目标接口:笔记本电脑的USB接口
interface UsbPort {void connectUsb();
}// 被适配者:内存卡
class MemoryCard {private String data;public MemoryCard(String data) {this.data = data;}public void insert() {System.out.println("内存卡已插入");}public String readData() {System.out.println("从内存卡读取数据: " + data);return data;}public void writeData(String newData) {this.data = newData;System.out.println("向内存卡写入数据: " + newData);}
}// 适配器:读卡器
class CardReader implements UsbPort {private MemoryCard memoryCard;public CardReader(MemoryCard memoryCard) {this.memoryCard = memoryCard;}@Overridepublic void connectUsb() {System.out.println("读卡器通过USB接口连接到笔记本电脑");memoryCard.insert();memoryCard.readData();}// 额外功能:通过USB接口写入数据到内存卡public void writeDataViaUsb(String data) {System.out.println("通过USB接口向内存卡写入数据");memoryCard.writeData(data);}
}// 客户端:笔记本电脑
class Laptop {public void useUsbDevice(UsbPort usbDevice) {System.out.println("笔记本电脑检测到USB设备连接");usbDevice.connectUsb();}
}// 演示适配器模式
public class AdapterPatternDemo {public static void main(String[] args) {// 创建内存卡(被适配者)MemoryCard memoryCard = new MemoryCard("照片、文档和数据文件");// 创建读卡器(适配器),将内存卡适配到USB接口CardReader cardReader = new CardReader(memoryCard);// 创建笔记本电脑(客户端)Laptop laptop = new Laptop();// 笔记本电脑通过USB接口使用内存卡laptop.useUsbDevice(cardReader);System.out.println("\n--- 额外功能演示 ---");// 通过适配器写入数据cardReader.writeDataViaUsb("新的照片和视频");cardReader.connectUsb(); // 再次读取验证数据已更新}
}

demo2:

// 目标接口:笔记本电脑的USB接口
interface USBCardReader {String readUSB();void writeUSB(String data);
}// 被适配者:SD卡
class SDCard {private String data = "";public String readSD() {System.out.println("从SD卡读取数据: " + data);return data;}public void writeSD(String data) {this.data = data;System.out.println("向SD卡写入数据: " + data);}
}// 适配器:SD卡读卡器(对象适配器模式)
class SDCardReader implements USBCardReader {private SDCard sdCard;public SDCardReader(SDCard sdCard) {this.sdCard = sdCard;}@Overridepublic String readUSB() {System.out.print("读卡器转换信号: SD → USB | ");return sdCard.readSD();}@Overridepublic void writeUSB(String data) {System.out.print("读卡器转换信号: USB → SD | ");sdCard.writeSD(data);}
}// 客户端:笔记本电脑
public class Laptop {public static void main(String[] args) {// 创建SD卡(被适配者)SDCard sdCard = new SDCard();// 创建读卡器(适配器)USBCardReader cardReader = new SDCardReader(sdCard);// 笔记本电脑通过USB接口使用SD卡System.out.println("=== 笔记本电脑通过读卡器操作SD卡 ===");cardReader.writeUSB("Hello, SD Card!");String data = cardReader.readUSB();System.out.println("读取到的数据: " + data);}
}

⚡ 一个更技术点的例子:电压转换

除了插头形状,电压也需要适配,这个例子能更完整地展示适配过程

  • ••

    被适配者 (Adaptee - 源接口):家里的 220V交流电

  • ••

    目标接口 (Target - 客户期望):手机充电需要的 5V直流电

  • ••

    适配器 (Adapter)充电器。你将它插入220V的插座,它内部进行复杂的电压转换,最终通过USB接口输出5V直流电,让你的手机能安全充电。

在这个过程中,手机(客户端)只关心最终得到5V直流电,它完全不知道220V交流电的存在,也不关心充电器内部是如何工作的。这就是适配器模式实现的解耦

💡 适配器模式的几种实现方式

在编程中,适配器模式主要有三种常见的实现形式,它们各有特点,适用于不同场景

  1. 1.1.类适配器模式:通过继承被适配的类来实现目标接口。这好比转换插头是通过改造国外插座的内部线路来兼容国标插头。这种方式由于依赖于继承,灵活性相对较低。

  1. 2.2.对象适配器模式:通过持有被适配类的实例(组合)来实现目标接口。这是最常用的方式,就像我们常见的那个独立的、两头都是插头的转换器。它更灵活,因为一个适配器可以适配多个不同的插座。

  1. 3.3.接口适配器模式(或缺省适配器):当一个接口方法太多,而我们只想使用其中一部分时,可以创建一个抽象类先空实现所有方法,我们再继承这个抽象类,只重写需要的方法。这就像你有一个多功能工具箱,但你只拿出螺丝刀来用,其他工具原样放着就好。

下面的序列图展示了客户端通过适配器调用方法的典型交互流程

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

相关文章:

  • 软件工程(速成笔记)
  • 深圳苏州企业网站建设服务公司网站建设很难吗
  • sward实战教程系列(4) - 如何编写Markdown文档
  • 树莓派5-ubuntu 24.04 ros-jazzy-desktop 创建 robot_navigation 包
  • 【Linux】调试监听接口是否正常
  • Flink CDC + StarRocks用 StarRocks Connector 打通实时明细与分析
  • Linux《Socket编程Tcp》
  • 2025.11.13 力扣每日一题
  • “暗激子(dark excitons)” 以 30万倍亮度被观测到
  • 数据归一化:提升模型训练的关键技巧
  • 网站外链建设可以提升网站权重对吗三亚平台公司
  • 怎么做一种网站为别人宣传lamp 做网站
  • UE5制作扭曲声波效果
  • 从 OneThreadOneLoop 线程池到进程池:高性能 Reactor 服务器的演进
  • C语言在线编译环境 | 提高编程效率与学习体验
  • 矩阵起源成功登陆深圳“专精特新”专板,加速 AI 数据智能新进程!
  • MPC模型预测控制原理全解析:从状态预测、矩阵推导到QP求解与滚动优化(含完整手推过程)
  • android recyclerview缓存2_四级缓存机制
  • [特殊字符] 在 macOS 上设置 SQLite
  • android recyclerview缓存1_概念和常见问题
  • SQLite 速成学习
  • [特殊字符] 在 Windows 上设置 SQLite
  • 做资源网站违法吗深圳大梅沙
  • 【环境数据处理】-基于R批量对环境数据克里金插值提高数据精度
  • 广州wap网站建设百度seo优化技术
  • linux centos常用命令整理
  • Java设计模式之建造者模式(Builder)详解
  • [智能体设计模式] 第6章:规划
  • 学习react第三天
  • 营销软文网站西安网站建设网络公司熊掌号