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

适配器模式

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

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

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

demo1:

java 复制代码
// 目标接口:笔记本电脑的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;
    }
    
    @Override
    public 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:

java 复制代码
// 目标接口:笔记本电脑的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;
    }
    
    @Override
    public String readUSB() {
        System.out.print("读卡器转换信号: SD → USB | ");
        return sdCard.readSD();
    }
    
    @Override
    public 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.接口适配器模式(或缺省适配器) :当一个接口方法太多,而我们只想使用其中一部分时,可以创建一个抽象类先空实现所有方法,我们再继承这个抽象类,只重写需要的方法。这就像你有一个多功能工具箱,但你只拿出螺丝刀来用,其他工具原样放着就好。

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

相关推荐
开开心心_Every12 小时前
支持自定义名单的实用随机抽签工具
运维·服务器·pdf·电脑·excel·启发式算法·宽度优先
2501_939998201 天前
在电脑上怎么连接打印机?电脑连接打印机的方法步骤
电脑
shandianchengzi1 天前
【记录】联想|联想电脑自带麦克风声音过小解决办法:问客服要驱动链接地址
电脑·音频·联想·麦克风
莱歌数字1 天前
AR眼镜分区散热方案:让SoC“冷”下来,让光学“稳”住
人工智能·科技·电脑·ar·制造·散热
沃普天科技1 天前
USB显示器驱动板触摸收款机显示器收银机点菜机广告机
驱动开发·游戏·计算机外设·电脑·ar·音视频·硬件工程
nnsix2 天前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
云飞云共享云桌面2 天前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑
AxureMost2 天前
免费开源无广告,电脑护眼首选轻量软件
电脑
Kurisu5752 天前
FilzaCracked_4.0.0_TS.ipa2026最新官方正版免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)手机版通用
ios·智能手机·电脑·巨魔
ACP广源盛139246256733 天前
IX8024 对标 ASM2824 @ACP#搭配昆仑芯 P800 构建 AI 服务器 PCIe4.0 高速互联架构
网络·人工智能·嵌入式硬件·电脑