大话设计模式八:适配器模式

一.模式定义

对象结构型模式,类结构型设计模式。  

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

Adapter Pattern: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. 

 

二.模式要素

1.Target:目标抽象类  

2.Adapter:适配器类  

3.Adaptee:适配者类  

4.Client:客户类

 

三.举例说明

电脑充电器大家一定见过,其实它就是一种非常典型的适配器。国内的家用插座电压统一是220V。那如果直接将220V的电压通到你的笔记本电脑里估计电脑会炸,所以必须使用电源适配器使得电压能够降到5V,这样才能给电脑正常使用。

其实适配器的实现分为两种:类适配器、对象适配器。

1.类适配器模式

大话设计模式八:适配器模式_第1张图片

 

2.对象适配器模式

大话设计模式八:适配器模式_第2张图片

 

四.模式实例

1.类适配器模式实例

Voltage220V.java    220V电压类

public class Voltage220V {
    int voltage = 220;

    public int supplyVoltage220V() {
        return voltage;
    }
}

 

Voltage5V.java    5V电压接口

public interface Voltage5V {
    public int supplyVoltage5V();
}

 

VoltageAdapter.java    类适配器

public class VoltageAdapter extends Voltage220V implements Voltage5V {

    @Override
    public int supplyVoltage5V() {
        int initialVoltage = supplyVoltage220V();
        System.out.println("开始适配电压,初始电压为" + initialVoltage + "V");
        int realVolatege = initialVoltage / 44;
        System.out.println("适配电压结束,真实电压为" + realVolatege + "V");
        return realVolatege;
    }
}

 

Main.java    调用者

public class Main {
    public static void main(String[] args) {
        // 无需适配电压
        Voltage220V voltage220V = new Voltage220V();
        int voltage1 = voltage220V.supplyVoltage220V();
        System.out.println("当前电压为" + voltage1 + "V" + "\n");

        // 适配电压
        VoltageAdapter adapter = new VoltageAdapter();
        int voltage2 = adapter.supplyVoltage5V();
        System.out.println("当前电压为" + voltage2 + "V");
    }
}

 

运行结果:

大话设计模式八:适配器模式_第3张图片

 

2.对象适配器模式实例

VoltageAdapter2.java

public class VoltageAdapter2 implements Voltage5V {
    private Voltage220V voltage220V;

    public VoltageAdapter2(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int supplyVoltage5V() {
        int realVoltage = 0;
        if(voltage220V != null) {
            int initialVoltage = voltage220V.supplyVoltage220V();
            System.out.println("开始适配电压,初始电压为" + initialVoltage + "V");
            realVoltage = initialVoltage / 44;
            System.out.println("适配电压结束,真实电压为" + realVoltage + "V");
        }
        return realVoltage;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        // 无需适配电压
        Voltage220V voltage220V = new Voltage220V();
        int voltage1 = voltage220V.supplyVoltage220V();
        System.out.println("当前电压为" + voltage1 + "V" + "\n");

        // 适配电压
//        VoltageAdapter adapter = new VoltageAdapter();
//        int voltage2 = adapter.supplyVoltage5V();
//        System.out.println("当前电压为" + voltage2 + "V");

        // 适配电压
        VoltageAdapter2 voltageAdapter2 = new VoltageAdapter2(new Voltage220V());
        int voltage3 = voltageAdapter2.supplyVoltage5V();
        System.out.println("当前电压为" + voltage3 + "V");
    }
}

运行结果:

大话设计模式八:适配器模式_第4张图片

 

五.总结

1.适配器模式的优点

(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

(2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。

(3)灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。

类适配器优点:

中由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

对象适配器优点:

可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

 

2.适配器模式的缺点

类适配器缺点:

对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

对象适配器缺点:

与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

 

3.适配器模式的适用场景

(1)系统需要使用现有的类,而这些类的接口不符合系统的需要。

(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

 

 

你可能感兴趣的:(设计模式)