设计模式——适配器模式

适配器模式 (Adapter Pattern)

什么是适配器模式?

适配器模式是一种结构型设计模式,它允许不兼容的接口一起工作。适配器模式充当两个不兼容接口之间的桥梁。

简单来说:适配器模式就像一个转换器,让不兼容的接口能够协同工作。

生活中的例子

想象一下:

  • 电源适配器:220V电压转换为5V电压,给手机充电
  • 读卡器:SD卡转换为USB接口,让电脑能读取
  • 转接头:HDMI转VGA,让不同接口的设备连接

为什么需要适配器模式?

传统方式的问题

java 复制代码
// 假设有一个第三方库,接口与我们系统不兼容
ThirdPartyService service = new ThirdPartyService();
service.doSomethingElse();  // 接口不兼容,无法使用

问题

  1. 接口不兼容:第三方接口与我们的系统不兼容
  2. 修改困难:无法修改第三方代码
  3. 代码耦合:直接依赖第三方接口,耦合度高

适配器模式的优势

java 复制代码
// 使用适配器
Adapter adapter = new Adapter(new ThirdPartyService());
adapter.doSomething();  // 通过适配器调用

优势

  1. 接口兼容:让不兼容的接口能够协同工作
  2. 无需修改:无需修改原有代码
  3. 解耦合:降低系统与第三方库的耦合度

适配器模式的结构

复制代码
┌─────────────────────┐
│      Target         │  目标接口
├─────────────────────┤
│ + request(): void   │
└─────────────────────┘
         ▲
         │ 实现
         │
┌────────┴────────┐
│    Adapter      │  适配器
├─────────────────┤
│ - adaptee: Adaptee│
│ + request(): void│
└────────┬────────┘
         │ 组合
         │
┌────────┴────────┐
│     Adaptee     │  被适配者
├─────────────────┤
│ + specificRequest(): void│
└─────────────────┘

代码示例

1. 定义目标接口

java 复制代码
/**
 * 目标接口
 */
public interface Target {
    /**
     * 请求方法
     */
    void request();
}

2. 定义被适配者

java 复制代码
/**
 * 被适配者:拥有不兼容接口的类
 */
public class Adaptee {
    /**
     * 特定请求方法(与目标接口不兼容)
     */
    public void specificRequest() {
        System.out.println("被适配者执行特定请求");
    }
}

3. 定义适配器

java 复制代码
/**
 * 适配器:将目标接口转换为被适配者的接口
 */
public class Adapter implements Target {
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    @Override
    public void request() {
        System.out.println("适配器转换请求...");
        adaptee.specificRequest();
    }
}

4. 使用适配器

java 复制代码
/**
 * 适配器模式测试类
 * 演示如何使用适配器模式让不兼容的接口协同工作
 */
public class AdapterTest {
    
    public static void main(String[] args) {
        System.out.println("=== 适配器模式测试 ===\n");
        
        // 创建被适配者
        Adaptee adaptee = new Adaptee();
        
        System.out.println("--- 直接调用被适配者(不兼容) ---");
        System.out.println("客户端无法直接使用被适配者的接口");
        
        System.out.println("\n--- 使用适配器 ---");
        // 创建适配器
        Target target = new Adapter(adaptee);
        // 客户端通过目标接口调用
        target.request();
        
        System.out.println("\n=== 实际应用场景示例:电源适配器 ===");
        System.out.println("场景:中国的电器(220V)要在美国使用(110V)");
        System.out.println("解决方案:使用电源适配器将110V转换为220V");
        
        System.out.println("\n=== 适配器模式的优势 ===");
        System.out.println("1. 接口兼容:让不兼容的接口能够协同工作");
        System.out.println("2. 无需修改:无需修改原有代码");
        System.out.println("3. 解耦合:降低系统与第三方库的耦合度");
        System.out.println("4. 灵活扩展:可以轻松添加新的适配器");
    }
}

适配器模式的优点

  1. 接口兼容:让不兼容的接口能够协同工作
  2. 无需修改:无需修改原有代码
  3. 解耦合:降低系统与第三方库的耦合度
  4. 灵活扩展:可以轻松添加新的适配器

适配器模式的缺点

  1. 增加复杂度:引入了额外的类
  2. 性能开销:多了一层调用

适用场景

  1. 接口不兼容:需要使用现有的类,但其接口与其他代码不兼容
  2. 复用第三方库:需要复用第三方库,但接口不兼容
  3. 统一接口:需要统一多个不兼容的接口

常见应用场景

  • 日志框架:适配不同的日志框架
  • 数据库访问:适配不同的数据库
  • 第三方API:适配第三方API接口

使用建议

  • 接口不兼容:使用适配器模式
  • 无法修改原有代码:使用适配器模式
  • 接口兼容:直接使用即可

注意事项

⚠️ 适配器模式虽然有用,但要注意:

  • 不要过度使用,增加不必要的复杂度
  • 考虑是否可以重构代码,而不是使用适配器
相关推荐
nnsix12 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756813 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏13 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood15 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师15 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek16 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix17 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix17 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896317 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面18 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑