适配器模式

介绍

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

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

相关推荐
sg_knight15 天前
适配器模式(Adapter)
python·设计模式·适配器模式·adapter
java干货22 天前
如何让 iPhone 用上 Type-C 充电器?适配器模式详解
c语言·iphone·适配器模式
驴儿响叮当201024 天前
设计模式之适配器模式
设计模式·适配器模式
沛沛老爹1 个月前
跨平台Agent Skills开发:适配器模式赋能提示词优化与多AI应用无缝集成
人工智能·agent·适配器模式·rag·企业转型·skills
Sivan_Xin1 个月前
拒绝 If-Else 屎山:利用适配器模式(Adapter)构建第三方登录的“防腐层”实战
linux·python·适配器模式
短剑重铸之日1 个月前
《设计模式》第七篇:适配器模式
java·后端·设计模式·适配器模式
小码过河.1 个月前
设计模式——适配器模式
设计模式·适配器模式
代码丰1 个月前
项目里接了多个第三方 SDK 后,如何使用适配器模式+策略模式优化?(Adapter + Strategy)
java·适配器模式·策略模式
懵萌长颈鹿1 个月前
适配器模式 (Adapter Pattern)
适配器模式