Skip to content
CodingDiary
返回

设计模式之结构型设计模式-适配器模式

导读

电脑 USB 接口和手机 Type-C 不兼容?买个转接头啊!适配器模式就是代码世界的「转接头」。本文用 USB 转 Type-C 的场景讲解:老接口不改动,新增适配器类做转换。Spring MVC 的 HandlerAdapter、Spring AOP 的 AdvisorAdapter 都是典型应用。

1. 模式简介

将一个原有的类的接口转换成期望的另一个接口,使原本的接口不兼容的类可以一起工作。属于结构型设计模式

2. 示例代码

这里我们模拟一个现实生活中的例子,之前电脑的接口都是 USB 接口,现在很多设备新增了 Type-C 接口,为了兼容,出了一种转接头设备,将 USB 接口输出变成 Type-C 接口输出。

  • USB 接口类
/**
 * <p>
 * 定义标准的电脑USB接口类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019/9/16 17:07
 */
public class Usb {
    /**
     * 接口类型
     *
     * @return USB
     */
    public String slot() {
        String type = "USB";
        System.out.println("接口类型:" + type);
        return type;
    }
}
  • Type-C 接口
/**
 * <p>
 * 新的Type-C接口
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019/9/16 17:10
 */
public interface TypeC {
    /**
     * 接口类型
     *
     * @return USB
     */
    String slot();
}
  • USB 转 Type-C 转接头
/**
 * <p>
 * USB接口 转 Type-C接口 转接头
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019/9/16 17:11
 */
public class TypeCAdapter implements TypeC {
    private Usb usb;

    public TypeCAdapter(Usb usb) {
        this.usb = usb;
    }

    /**
     * 接口类型
     *
     * @return USB
     */
    @Override
    public String slot() {
        String originalType = usb.slot();
        String type = transformSlot(originalType);
        System.out.println("接口类型:" + type);
        return type;
    }

    private String transformSlot(String originalType) {
        String type = "Type-C";
        System.out.println("使用 " + originalType + "" + type + " 转接头");
        return type;
    }
}
  • 测试类
/**
 * <p>
 * 适配器模式 - 测试类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019/9/16 17:15
 */
public class PatternTest {
    public static void main(String[] args) {
        TypeC typeC = new TypeCAdapter(new Usb());
        typeC.slot();
    }
}
  • 测试结果
接口类型:USB
使用 USB Type-C 转接头
接口类型:Type-C

3. UML 图例

design-pattern-adapter-uml

4. 应用

// Spring MVC 中的 HandlerAdapter

// Spring AOP 中的 AdvisorAdapter

5. 场景

  • 已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。

  • 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决 方案。

6. 优缺点

优点: 1、能提高类的透明性和复用,现有的类复用但不需要改变。 2、目标类和适配器类解耦,提高程序的扩展性。 3、在很多业务场景中符合开闭原则。

缺点: 1、适配器编写过程需要全面考虑,可能会增加系统的复杂性。2、增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

7. 完整代码地址

https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/structural/adapter


CC BY-NC-SA 4.0

本文采用 CC BY-NC-SA 4.0 协议,转载请注明出处。

原文链接: https://xkcoding.com/2019-09-13-design-pattern-adapter.html