:::info 这个设计模式在日常开发中出镜率极高,关键还不难,所以兄弟们一定要掌握啊。 :::

定义

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式还有个别名叫:Wrapper(包装器),顾名思义就是将目标类用一个新类包装一下,相当于在客户端与目标类直接加了一层。IT世界有句俗语:没有什么问题是加一层不能解决的。

使用场景

  • 当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时
  • 当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时。(别和我说这不可能,这太tm可能了)

    UML类图

    适配器模式 - 图1

    角色结构

  • Target 是一个接口,它是我们客户端使用的目标接口

  • Adaptee 我们想要使用的接口与Target不兼容的类,它可以是一个接口,也可以是一个类。
  • Adapter 适配器类,此模式的核心。它需要实现目标接口Target,而且必须要引用Adaptee,因为我们要在此类中包装Adaptee的功能

    优点

    极大的增强了程序的可扩展性,通过此模式,你可以随意扩展程序的功能,但却不需要修改接口

    缺点

    其实在我看来这个模式真没啥缺点,唯一可以称的上的缺点是多了一层,但是这也是没有办法的事情。

    业务场景

    手机需要充电,手机只能使用5V的电压
    插座提供220V的电压
    我们需要将220V的电压经过适配器转换成5V的电压然后供手机使用

    代码案例

    Voltage220V.java

    1. public class Voltage220V {
    2. public int output220V() {
    3. System.out.println("插座输出220V电压");
    4. return 220;
    5. }
    6. }

    Voltage5V.java

    1. public interface Voltage5V {
    2. int output5V();
    3. }

    VoltageAdapter.java

    :::info 其实这里的依赖关系也可以使用继承关系。 :::

    1. public class VoltageAdapter implements Voltage5V {
    2. private Voltage220V voltage220V;
    3. public VoltageAdapter(Voltage220V voltage220V) {
    4. this.voltage220V = voltage220V;
    5. }
    6. @Override
    7. public int output5V() {
    8. int srcV = voltage220V.output220V();
    9. System.out.println("转换电压处理");
    10. System.out.println("转换之前" + srcV);
    11. int out = srcV / 44;
    12. System.out.println("转换之后" + out);
    13. return out;
    14. }
    15. }

    Phone.java 客户端类

    1. public class Phone {
    2. public void charging(Voltage5V voltage5V) {
    3. int voltage = voltage5V.output5V();
    4. if (voltage == 5) {
    5. System.out.println("手机正在充电,电压为" + voltage);
    6. } else {
    7. System.out.println("电压不合适");
    8. }
    9. }
    10. }

    测试类

    1. public class Test {
    2. public static void main(String[] args) {
    3. new Phone().charging(new VoltageAdapter(new Voltage220V()));
    4. }
    5. }

    输出

    1. 插座输出220V电压
    2. 转换电压处理
    3. 转换之前220
    4. 转换之后5
    5. 手机正在充电,电压为5