图解设计模式 - Adapter 模式

适配器模式(Adapter模式)是一种结构型设计模式,它允许不同接口的类协同工作。通过创建一个适配器类,将原有类的接口转换为客户期望的接口,使得原本因接口不兼容而不能一起工作的类可以协同工作。适配器模式分为类适配器和对象适配器两种形式。主要应用场景包括复用已有组件、没有现成代码以及解决版本升级的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读书笔记 仅供参考

Adapter 模式

Adapter 即为是适配器,用来填补两者之间的差异。就想充电器的装换器,要把 220v 的电压转换为低电压才能对手机或电脑充电。
Adapter 模式也称为 Wrapper(包装器)模式。
两种 Adapter 模式:

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

角色

Client 类是客户端,调用适配器。
Adaptee 是需要包装的类,等于是 220V 电压的接头。
Target 接口是供客户端调用的接口,它定义了适配器需要实现的方法,等于是手机充电转化器的 USB 插口。
Adapter 类是适配器类,它继承了 Adaptee 类和实现类 Target 接口,等于转换器的内部构造,清楚如何将电压从 220V 转为 5V。

代码

https://github.com/wujunyucg/DesignPattern/tree/master/src/chapter01/adapter

类适配模式

UML

这里写图片描述

例子

Banner 类,作为 Adaptee,实现了最初的方法。

public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }
    public void showWithPattern() {
        System.out.println("(" + string + ")");
    }

    public void showWithStar() {
        System.out.println("*" + string + "*");
    }
}

Print 接口,定义了客户端调用的方法,作为 Target

public interface Print {
    void printWeek();
    void printStrong();
}

PrintBanner 类,继承了 Banner 和实现了 Target,作为 Adpter

public class PrintBanner extends Banner implements Print{

    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeek() {
        showWithPattern();
    }

    @Override
    public void printStrong() {
        showWithStar();
    }
}

Main 类,测试效果

public class Main {

    public static void main(String[] args) {
        Print print = new PrintBanner("Hello");
        print.printWeek();
        print.printStrong();
    }
}

在这个例子中,Main 调用 PrintBanner 的方法,实际上起作用的是 Banner 类中的方法,Main 并不知道其中的实现是怎样的。

例子 UML

这里写图片描述

对象适配器模式

对象适配器模式即是使用委托的模式,使用组合来替代继承。

UML

这里写图片描述
这张图和上面一张图的区别是 Adapter 并不是继承 Adaptee 和 实现 Target 了。
Adaptee 的实例作为 Adapter 的一个属性。Target 并不是一个接口,而是一个抽象类,同样定义了供 Client 调用的方法,Adapter 继承了 Target 类。

程序例子

Main 和 Banner 的程序和上面一样。

Print 类,为抽象类。

public abstract class Print {
    public abstract void printWeek();
    public abstract void printStrong();
}

PrintBanner 类,拥有一个 Banner 实例,继承了 Print 类。在实现哦方法中调用了 Banner 的方法。

public class PrintBanner extends Print{

    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeek() {
        banner.showWithPattern();
    }

    @Override
    public void printStrong() {
        banner.showWithStar();
    }
}
例子 UML

这里写图片描述

何时使用 Adapter 模式

复用已有组件

我们更倾向于不修改已有程序的代码,并且能够更多的复用已存在的“组件”。Adapter 模式会对现有类进行适配,生成新的类,当出现 BUG 时,我们也能确定出现问题的是 Adapter 类,而不是 Adaptee 类。

没有现成的代码

有时候我们会想到把现有程序改一改就可以成功运行了,但有时候我们只能使用一些特定的接口,无法知道源代码,这样 Adapter 模式就可以发挥作用了。

版本升级与兼容性

使用 Adapter 模式可以很好地解决软件版本升级后出现的兼容性问题。

相关设计模式

Bridge 模式

Adapter 模式用于连接接口不同的类,Bridge 模式用于连接类的功能层次结构和实现层次结构

Decorator 模式

Decorator 模式是在不改变接口的前提下添加功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值