设计模式——适配器模式

323 阅读3分钟

1. 适配器模式概述

适配器模式可以作为两个不兼容的接口之间的桥梁。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

适配器模式可以让一个对象调用接口时,执行的是原本不兼容的另一个接口的功能。

(1) 适用情况

系统需要使用现有的类的功能,但是此类的接口不符合系统的需要。

(2) 优点

对本无法被调用的代码进行复用,通过实现新接口,使其适配新的需要。

(3) 缺点

如果使用类适配器,由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类或接口。
适配器修改了原本类的功能,容易使得理解困难。

2. 适配器模式实例

现在我们有一个手机,它只能使用5V的电压进行充电,但是国内的居民用电电压都是220V,为了给手机充电,需要对电压进行适配。

(1) 类适配器

1) 声明电源电压输出接口和手机充电电压输出接口

public interface PowerVoltageOutput {
    /**
     * 电源输出电压
     */
    int output();
}
public interface PhoneVoltageOutput {
    /**
     * 手机充电所需5V电压
     */
    int output5();
}

2) 实现电源类,实现电压输出接口

public class PowerVoltage implements PowerVoltageOutput {
    @Override
    public int output() {
        // 输出220V电压
        return 220;
    }
}

3) 实现电压适配器,将220V电压转换为5V电压

public class VoltageAdapter extends PowerVoltage implements PhoneVoltageOutput {
    /**
     * 输出5V电压
     */
    @Override
    public int output5() {
        System.out.println("使用适配器进行电压适配...");
        int input = super.output();
        int output = input / 44;
        System.out.println("输入电压:" + input + "V" + ",适配为:" + output + "V");
        return output;
    }
}

这里使用的是继承的方式,只能继承一个电源类。

4) 使用适配器进行电压转换

public static void main(String[] args) {
    PowerVoltage powerVoltage = new PowerVoltage();
    System.out.println("当前电压为:" + powerVoltage.output() + "V");

    VoltageAdapter adapter = new VoltageAdapter();
    System.out.println("当前电压为:" + adapter.output5() + "V");
}

(2) 对象适配器

在实现电压适配器时,可以使用组合来替代继承的方式,减少其耦合。

public class VoltageAdapter extends PowerVoltage implements PhoneVoltageOutput {

    PowerVoltage powerVoltage = new PowerVoltage();

    /**
     * 输出5V电压
     */
    @Override
    public int output5() {
        System.out.println("\n使用适配器进行电压适配...");
        int input = powerVoltage.output();
        int output = input / 44;
        System.out.println("输入电压:" + input + "V" + ",适配为:" + output + "V");
        return output;
    }
}

运行结果:
image.png

3. 一些思考

适配器模式、装饰器模式以及代理模式有相似之处,但是这几个模式设计的目的是不同的:

适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的;
适配器是自己新建接口并实现,在实现中包含被适配的接口,从而改变所考虑对象的接口;
适配器模式包装的是不同类型的对象,然后将其伪装成自己的同类。

装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能;
装饰器模式包装的是自己的同类,相同的接口或者父类;
装饰器模式从来不创建被装饰的对象,它总是添加新功能到已经存在的对象上面;
装饰器模式可以通过嵌套装饰添加多重额外功能。

代理模式中,我们创建具有现有对象能力的对象,以控制对这个对象的访问,向外界提供功能接口;
代理模式与源对象实现同一接口,不能改变所代理对象的接口,只能控制对其的操作;
代理模式一般不推荐使用嵌套代理。

参考引用

适配器模式:www.runoob.com/design-patt…
适配器模式及典型应用:blog.csdn.net/wwwdc1012/a…
适配器模式,装饰模式,代理模式区别与对比:www.jianshu.com/p/414d0acff…