适配器模式

介绍

**定义:**适配器模式的主要作用是做兼容, 它可以将原本不兼容的接口转换为可兼容的接口, 从而使它们可以一起工作. 适配器模式有两种实现方式: 类适配器(继承关系)和对象适配器(组合关系), 由于类适配器的耦合度较高, 所以开发中通常使用对象适配器.

UML

示例

java 复制代码
package com.sumlv.demo;

import com.sumlv.demo.decorator.IOSAdapterAndroid1;
import com.sumlv.demo.decorator.IOSAdapterAndroid2;
import com.sumlv.demo.service.impl.AndroidPhoneImpl;

public class Main {

    public static void main(String[] args) {
        Phone phone = new Phone();
        // 类适配器
        phone.printSystem(new IOSAdapterAndroid1());
        // 对象适配器
        phone.printSystem(new IOSAdapterAndroid2(new AndroidPhoneImpl()));
    }

}
java 复制代码
package com.sumlv.demo;

import com.sumlv.demo.service.IOSPhone;

/**
 * 手机类(模拟客户端)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public class Phone {

    /**
     * 打印系统名称(模拟实际业务)
     * 由于入参只有苹果手机, 所以无法兼容安卓手机
     */
    public void printSystem(IOSPhone phone) {
        System.out.println(phone.getSystemName());
    }

}
java 复制代码
package com.sumlv.demo.decorator;

import com.sumlv.demo.service.IOSPhone;
import com.sumlv.demo.service.impl.AndroidPhoneImpl;

/**
 * 苹果兼容安卓适配器(类适配器)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public class IOSAdapterAndroid1 extends AndroidPhoneImpl implements IOSPhone {

    @Override
    public String getSystemName() {
        return super.getSystemName();
    }

}
java 复制代码
package com.sumlv.demo.decorator;

import com.sumlv.demo.service.AndroidPhone;
import com.sumlv.demo.service.IOSPhone;

/**
 * 苹果兼容安卓适配器(对象适配器)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public class IOSAdapterAndroid2 implements IOSPhone {

    private AndroidPhone androidPhone;

    public IOSAdapterAndroid2(AndroidPhone androidPhone) {
        this.androidPhone = androidPhone;
    }

    @Override
    public String getSystemName() {
        return androidPhone.getSystemName();
    }

}
java 复制代码
package com.sumlv.demo.service;

/**
 * 苹果手机(目标抽象接口)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public interface IOSPhone {

    String getSystemName();

}
java 复制代码
package com.sumlv.demo.service.impl;

import com.sumlv.demo.service.IOSPhone;

/**
 * 苹果手机实现(目标抽象接口实现)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public class IOSPhoneImpl implements IOSPhone {

    @Override
    public String getSystemName() {
        return "IOS";
    }

}
java 复制代码
package com.sumlv.demo.service;

/**
 * 安卓手机(适配者接口)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public interface AndroidPhone {

    String getSystemName();

}
java 复制代码
package com.sumlv.demo.service.impl;

import com.sumlv.demo.service.AndroidPhone;

/**
 * 安卓手机实现(适配者接口实现)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-10
 */
public class AndroidPhoneImpl implements AndroidPhone {

    @Override
    public String getSystemName() {
        return "Android";
    }

}

总结

使用场景

  1. 当需要设计统一多个类的接口时(如果某个功能需要依赖多个外部类, 就可以通过适配器将他们适配为统一的接口定义);

  2. 当系统需要替换外部依赖时(使用适配器可以减少代码的改动);

  3. 当原有接口无法更改又必须兼容时(参照jdk中Iterator兼容Enumeration).

优点:

  1. 可以在重用现有适配者类的情况下使目标类和适配者类之间解耦, 更无需修改原有结构;

  2. 提高了透明性(对客户端而言, 兼容逻辑是透明的);

  3. 提高了复用性(适配者可以在多个系统中复用);

  4. 提高了灵活性(可以通过配置文件更换适配器);

  5. 提高了拓展性(新增适配器无需修改原代码, 符合开闭原则).

缺点:

  1. 由于java不能多继承, 所以一次最多适配一个类(类适配器);

  2. 无法为最终类做适配(类适配器);

  3. 当需要置换适配者类中的某些方法时比较麻烦(对象适配器).

相关推荐
kiracrimson2 天前
栈与队列容器:适配器、deque 与 priority_queue
开发语言·c++·适配器模式
傲世仙尊3 天前
stack-queue与deque-适配器模式中控数组分段连续与仿函数
适配器模式
Eyfcom4 天前
〖物流系统架构演进实录 02〗物流网关设计:多平台接入适配与异构接口的统一收敛
适配器模式·物流管理系统·物流架构·网关设计·多平台对接
yuehuaxin0114 天前
LS8011C 快充协议芯片|SOT‑23‑6L 内置 431,PD3.2 SPR/PPS 适配器物料备选评估调试笔记
笔记·智能家居·适配器模式·智能硬件
yuehuaxin0115 天前
LP3717BSL 芯茂微|SOP8L 自供电 PSR,SEL 电阻调峰值电流,12W 充电器物料替代评估笔记
嵌入式硬件·适配器模式·智能硬件
缓慢更新15 天前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
博风17 天前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
范中勤21 天前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
yuehuaxin0121 天前
上海贝岭 BL6523GX(D78) 单相计量芯片开发笔记:引脚定义、寄存器配置与校表流程
嵌入式硬件·智能家居·适配器模式·智能硬件
yuehuaxin011 个月前
LP20R100FN 同步整流|3C 认证适配器 CCM 工况倒灌、温升超标样机避坑解析
嵌入式硬件·智能家居·适配器模式·智能硬件