设计模式之适配器模式

适配器模式

什么是适配器模式

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

其原理图如下:

设计模式之适配器模式

为什么要使用适配器模式

现在,手机需要进行充电,但是手机需要的是5V的电压,墙上的插口只能提供220V的电压(外国还有110V电压),这显然是不能直接给手机充电的。

在日常生活中,我们是使用电源适配器进行适配,顾名思义,这是一个适配器。我们可以通过手机的充电过程来理解适配器模式:

首先,有一个插孔(墙上或插线板上的220V的插孔):

public class Jack220V {
    public int output220V() {
        System.out.println("墙上插孔 220V 电压输出");
        return 220;
    }
}

指定一个标准,电源适配器需要满足该标准:

public interface IAdapter {
    int input(); // 输入电压

    int convert(); //进行电压转换

    int output(); //输出电压
}

现在的电源适配器:

public class Jack5V implements IAdapter {
    private Jack220V jack = new Jack220V(); //聚合一个被适配的类,以此来使用该类的方法,这种方式叫做对象适配器;也可以让这个类继承被适配的类,也可以达到该效果,只是耦合度有些过高,这种方式叫做类适配器。

    @Override
    public int input() {
        int voltage = jack.output220V();
        System.out.println("电源适配器获取 220V 电压");
        return voltage;
    }

    @Override
    public int convert() {
        int voltage = input();
        System.out.println("电源适配器进行电压变化");
        return voltage / 44;
    }

    @Override
    public int output() {
        int voltage = convert();
        System.out.println("电源适配器输出 5V 电压");
        return voltage;
    }
}

接下来,我们可以进行充电了:

public class Phone {
    public static void main(String[] args) {
        System.out.println("手机充电:");
        Jack5V jack = new Jack5V();
        System.out.println("手机充电电压:" + jack.output() + "V");
    }
}

当前的类图

设计模式之适配器模式

什么时候用适配器模式

  • 在使用一个已经存在的类,但是该类的接口与自己所要求的不相同时,此时应该使用适配器模式。

  • 使用适配器模式往往是在软件开发后期或维护期才使用,在设计时期完全可以设计一个更通用的接口或者进行接口的重构使得接口得以适合更多场景的使用。

  • 当然,在特殊情况下,比如需要考虑到使用第三方开发组件,但是这个组件和现有组件不同时,可以考虑使用适配器模式。

上一篇:Python-内置函数_@propery、@classmethod、@staticmethod详解


下一篇:好玩的树莓派