适配器模式

介绍

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

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

相关推荐
basketball6168 天前
设计模式入门:3. 适配器模式详解 C++实现
c++·设计模式·适配器模式
晚风吹红霞8 天前
C++ stack 和 queue 完全指南:适配器模式与双端队列的奥秘
c++·算法·适配器模式
Rick19939 天前
代理模式 vs 适配器模式
代理模式·适配器模式
老码观察12 天前
设计模式实战解读(七):适配器模式——让不兼容的接口无缝协作
java·设计模式·适配器模式
nnsix21 天前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
雪碧聊技术24 天前
什么是适配器模式?一文详解
适配器模式
蜡笔小马1 个月前
05.C++设计模式-适配器模式
c++·设计模式·适配器模式
c++之路1 个月前
适配器模式(Adapter Pattern)
java·算法·适配器模式
Forget the Dream1 个月前
基于适配器模式的 Axios 封装实践
设计模式·typescript·axios·适配器模式
likerhood1 个月前
java设计模式 · 适配器模式 (Adapter Pattern)
java·设计模式·适配器模式