适配器模式

什么是适配器模式?

适配器模式(Adapter Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

说人话:这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。比如现实生活中的例子, USB 转接头就充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。

适配模式定义

①、Target目标角色

该角色定义把其他类转换为何种接口, 也就是我们的期望接口, 例子中的IUserInfo接口就是目标角色。

②、Adaptee源角色

你想把谁转换成目标角色, 这个“谁”就是源角色, 它是已经存在的、 运行良好的类或对象, 经过适配器角色的包装, 它会成为一个崭新、 靓丽的角色。

③、Adapter适配器角色

适配器模式的核心角色, 其他两个角色都是已经存在的角色, 而适配器角色是需要新建立的, 它的职责非常简单: 把源角色转换为目标角色, 怎么转换? 通过继承或是类关联的方式。

实现方式

适配器模式有三种主要形式:

1、对象适配器(基于组合)

// 已存在的220V电压(Adaptee)
class AC220 {
    int output220V() { return 220; }
}

// 目标接口:5V
interface DC5 {
    int output5V();
}

// 对象适配器:组合一个AC220对象
class PowerAdapter implements DC5 {
    private final AC220 ac220;          // 组合
    PowerAdapter(AC220 ac220) {
        this.ac220 = ac220;
    }
    public int output5V() {
        return ac220.output220V() / 44; // 降压到5V
    }
}

优点:

遵循 组合优先于继承,不改变 Adaptee 的代码。
可以适配多个 Adaptee,更灵活。
2、类适配器(基于继承)

// 被适配者
class AC220 {
    int output220V() { return 220; }
}

// 目标接口
interface DC5 {
    int output5V();
}

// 类适配器:继承 + 实现
class PowerAdapter extends AC220 implements DC5 {
    public int output5V() {
        return output220V() / 44; // 直接继承父类方法
    }
}

缺点:

由于 Java 不支持多继承,适配器无法同时适配多个 Adaptee。
适配器与 Adaptee 绑定,不够灵活。

3、接口适配器(基于抽象类)

// 一个臃肿的接口
interface AllInOne {
    void a();
    void b();
    void c();
}

// 抽象空实现,避免子类全部实现
abstract class Adapter implements AllInOne {
    public void a() {}
    public void b() {}
    public void c() {}
}

// 具体业务只关心b方法
class Service extends Adapter {
    @Override
    public void b() {
        System.out.println("do b");
    }
}

优点:

让子类只需覆盖需要的方法,避免实现所有方法。
常用于 Java Swing、Servlet API 的监听器适配。
一句话总结

形式 关键语法 使用场景
对象适配器 组合 + 实现 被适配者不可继承或需多态
类适配器 继承 + 实现 被适配者可继承、追求简单
接口适配器 抽象类 + 空实现 接口方法多、只需局部实现
posted @ 2025-07-13 21:08  茴香儿  阅读(7)  评论(0)    收藏  举报