设计模式-设配器模式

312 阅读3分钟

说到适配器,我们最熟悉的就是电源适配器了,也就是手机的充电头,它就是适配器模式的一个应用。 试想一下,有一条连接电脑和手机的USB数据线,连接电脑的一端从电脑接口处接收5V的电压,连接手机的一端向手机输出5V的电压,并且他们工作良好。

中国的家用电压都是220V,所以USB数据线不能直接拿来给手机充电,这时候有两种方案:

-单独制作手机充电器,接收220V家用电压,输出5V的电压

-添加一个适配器,将220V的家庭电压转化为类似电脑接口的5V电压,再连接数据线给手机充电

如果使用过早期的手机,就会知道以前的厂商采用的就是第一种方案,早期的手机充电器都是单独制作的,充电头和充电线是连在一起的,现在的手机都采用了电源适配器加数据线的方案,这就是生活中应用适配器模式的一个进步。

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

适配的意思就是适应,匹配,通俗的讲,适配器模式适用于有相关性但不兼容的结构,源接口通过一个中间件转换后才可以适用于目标接口,这个转换过程就是适配,这个中间件称之为适配器。

家用电源和USB数据线有相关性,家用电源输出电压,USB数据线输入电压,但两个接口无法兼容,因为一个输出220V,一个输入5V,通过适配器将输出220V转换成5V之后才可以一起工作。

让我们用程序来模拟这个过程:

class HomeBattery {
    int supply() {
        // 家用电源提供一个 220V 的输出电压
        return 220;
    }
}

USB数据线只接受5V的充电电压:

class USBLine {
    void charge(int volt) {
        // 如果电压不是 5V,抛出异常
        if (volt != 5) throw new IllegalArgumentException("只能接收 5V 电压");
        // 如果电压是 5V,正常充电
        System.out.println("正常充电");
    }
}

先来看看适配之前,用户如果直接用家庭电源给手机充电:

public class User {
    @Test
    public void chargeForPhone() {
        HomeBattery homeBattery = new HomeBattery();
        int homeVolt = homeBattery.supply();
        System.out.println("家庭电源提供的电压是 " + homeVolt + "V");

        USBLine usbLine = new USBLine();
        usbLine.charge(homeVolt);
    }
}

运行如下:

家庭电源提供的电压是 220V 
java.lang.IllegalArgumentException: 只能接收 5V 电压

这时,我们加入电源适配器:

class Adapter {
    int convert(int homeVolt) {
        // 适配过程:使用电阻、电容等器件将其降低为输出 5V
        int chargeVolt = homeVolt - 215;
        return chargeVolt;
    }
}

然后,用户再使用适配器将家庭电源提的电压转换为充电电压:

public class User {
    @Test
    public void chargeForPhone() {
        HomeBattery homeBattery = new HomeBattery();
        int homeVolt = homeBattery.supply();
        System.out.println("家庭电源提供的电压是 " + homeVolt + "V");

        Adapter adapter = new Adapter();
        int chargeVolt = adapter.convert(homeVolt);
        System.out.println("使用适配器将家庭电压转换成了 " + chargeVolt + "V");

        USBLine usbLine = new USBLine();
        usbLine.charge(chargeVolt);
    }
}

运行程序输出如下:

家庭电源提供的电压是 220V 
使用适配器将家庭电压转换成了 5V 正常充电

这就是适配器模式,在我们日常的开发过程中经常会使用到各种各样的Adapter,都属于适配器模式的应用。 但适配器模式并不推荐多用,因为未雨绸缪好过亡羊补牢,如果事先能预防接口不同的问题,不匹配问题就不会发生,只有遇到源接口无法改变时,才应该考虑适配器模式,比如现在使用的电源接口中很多已经增加了专门的USB充电接口,让我们不需要再使用适配器转换接口。