一、什么是适配器模式?

       适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能,也就是将两个不兼容的功能通过Adapter兼容在一起。

       例如,我有一台电脑,支持USB接口,我的鼠标也是USB接口的,自然,可以直接使用,但是我有一张SD卡,电脑没有相应接口当然无法直接读取,当然我们可以选择——读卡器,没错,读卡器就相当于适配器,将SD卡接口转接为USB接口,可以让电脑读取SD的东西。

       这样的东西还有很多,比如SpringMVC中的处理器适配器,我们的映射地址可能来自XML配置文件,也有可能来自@RequestMapping,那么我们就需要一个适配器,进行处理映射地址。

     

二、模式结构

适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。(相当于上述例子的USB接口)
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。(相当于SD卡)
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。(相当于读卡器)

三、实现

3.1、类适配器

为什么叫类适配器呢?它是由类继承实现。

根据以上USB的例子,

/**
 * USB接口
 */
interface Usb {
    void use();
}
/**
 * 鼠标实现USB类
 */
class MouseUsb implements Usb {

    public void use() {
        System.out.println("我是鼠标,可以使用USB接口");
    }
}

这时候,我们使用鼠标当然很正常,但是,现在我们需要使用SD卡,下面是SD卡的代码。

/**
 * SDCard接口
 */
interface SDCard {
    void useSD();
}

/**
 * SDCard 类
 */
class SDCardHandle implements SDCard {
    public void useSD() {
        System.out.println("我是SD卡,经过转换才能使用USB接口");
    }
}

也就是说SDCard接口和USB接口是功能完全不相同的两个接口。如果想将他们兼容在一起,那么必须使用适配器。

/**
 * SDCard适配器,也就是现实中的读卡器,继承了SDCard
 */
class SDCardAdapter extends SDCardHandle implements Usb {

    public void use() {
        super.useSD();
    }
}

现在我们开始使用它

public class ClassAdapterTest {
    public static void main(String[] args) {
        Usb usb1 = new MouseUsb();
        usb1.use();
        Usb usb2 = new SDCardAdapter();
        usb2.use();
    }
}

运行结果

我是鼠标,可以使用USB接口
我是SD卡,经过转换才能使用USB接口

3.2、对象适配器

对象适配器和类适配器比较相似,通过对象调用方法的形式。代码如下,大家可以比较一下便知晓。

/**
 * USB接口
 */
interface Usb {
    void use();
}

/**
 * 鼠标实现USB类
 */
class MouseUsb implements Usb {

    public void use() {
        System.out.println("我是鼠标,可以使用USB接口");
    }
}

/**
 * SDCard接口
 */
interface SDCard{
    void useSD();
}

/**
 * SDCard 类
 */
class SDCardHandle implements SDCard {
    public void useSD() {
        System.out.println("我是SD卡,经过转换才能使用USB接口");
    }
}

/**
 * SDCard适配器,也就是现实中的读卡器,注意此处的不同
 */
class SDCardAdapter implements Usb {
    SDCardHandle sdCardHandle;

    public SDCardAdapter(SDCardHandle sdCardHandle) {
        this.sdCardHandle = sdCardHandle;
    }

    public void use() {
        sdCardHandle.useSD();
    }
}

/**
 * 主类
 */
public class ObjectAdapterTest {
    public static void main(String[] args) {
        Usb usb1 = new MouseUsb();
        usb1.use();
        Usb usb2=new SDCardAdapter(new SDCardHandle());
        usb2.use();

    }
}

四、结语

本文代码已经上传到 码云,需要的点击下载(https://gitee.com/luckylqm/DesignPatterns),喜欢本教程的可以star一下,感谢您的阅读!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐