Preview
Skip to content
CodingDiary
返回

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

编辑页面
导读

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

1. 模式简介

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

2. 示例代码

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

/**
 * <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;
    }
}
/**
 * <p>
 * 新的Type-C接口
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019/9/16 17:10
 */
public interface TypeC {
    /**
     * 接口类型
     *
     * @return USB
     */
    String slot();
}
/**
 * <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


编辑页面
分享到:

上一篇
使用 docker 运行 easy-mock
下一篇
设计模式之行为型设计模式-策略模式