适配器模式

介绍

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

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. 当需要置换适配者类中的某些方法时比较麻烦(对象适配器).

相关推荐
Lyyaoo.4 天前
适配器模式
单元测试·适配器模式
bmseven5 天前
23种设计模式 - 适配器模式(Adapter)
设计模式·适配器模式
君主黑暗6 天前
设计模式-适配器模式
设计模式·适配器模式
砍光二叉树8 天前
【设计模式】结构型-适配器模式
设计模式·适配器模式
魑魅魍魉都是鬼12 天前
Java 适配器模式(Adapter Pattern)
java·开发语言·适配器模式
彭于晏Yan14 天前
Spring Boot中适配器模式的实现方式
spring boot·设计模式·适配器模式
geovindu20 天前
python: Adapter Pattern
java·python·设计模式·适配器模式
Anurmy20 天前
设计模式之适配器模式
设计模式·适配器模式
JTCC20 天前
Java 设计模式西游篇 - 第八回:适配器模式通万国 女儿国语言无障碍
python·设计模式·适配器模式
无心水20 天前
【OpenClaw:实战部署】7、Channel子系统设计:如何优雅接入10+消息渠道?——统一接口+适配器模式实战
适配器模式