设计模式——适配器模式

适配器模式 (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接口

使用建议

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

注意事项

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

  • 不要过度使用,增加不必要的复杂度
  • 考虑是否可以重构代码,而不是使用适配器
相关推荐
小湘西3 小时前
拓扑排序(Topological Sort)
python·设计模式
蜜獾云7 小时前
设计模式之观察者模式:监听目标对象的状态改变
观察者模式·设计模式·rxjava
知无不研7 小时前
中介者模式
c++·设计模式·中介者模式
bmseven7 小时前
大白话讲解23种设计模式简介
设计模式
蜜獾云7 小时前
设计模式之代理模式:本地接口代理远程接口的调用
设计模式·系统安全·代理模式
蜜獾云7 小时前
设计模式之访问者模式:动态的给目标对象增加新功能
设计模式·访问者模式
蜜獾云9 小时前
设计模式之策略模式:替换掉糟糕的if else语句实现面向对象编程而非面向过程
设计模式·策略模式
蜜獾云10 小时前
设计模式之状态模式:封装数据的状态流转逻辑
设计模式·状态模式
Serene_Dream10 小时前
深度解析设计模式:单例模式(Singleton Pattern)
单例模式·设计模式
朱一头zcy10 小时前
设计模式入门:最简单的单例模式
笔记·单例模式·设计模式