设计模式之 适配器模式

假设我们现在有一个接口,我们希望它和一个新的类库搭配使用,但是这个新的类的接口又和旧的类库不一样;

image-20201121202056041

如果现在不改变原有类和新类的情况下,我们可以写个类,将现有类的接口转化为新类的需要的接口。我们把这个类成为适配器类

image-20201121203515531

这个适配器类的作用就如同一个中间人,他将现有的资源转化为目标客户需要的东西。

image-20201121203731402

适配器模式的定义

将一个类的接口转化为客户期望的另一个接口,适配器模式让原本接口不兼容的两个类可以进行合作无间。

类图

image-20201121220303256

实例

我们现在根据电源适配器来分析适配器模式
首先我们定义已经存在的系统,定义一个电脑和电源。

/**
 * 电源接口
 *
 * @author lixin
 */
public interface IPower {
    /**
     * 输出电源
     *
     * @return 返回电压
     * @author "miaopasi"
     */
    int outPower();
}

/**
 * 电源实现类
 *
 * @author lixin
 */
public class Power implements IPower {
    /**
     * 直插电压
     *
     * @return 输出15V电压
     */
    @Override
    public int outPower() {
        return 15;
    }
}

/**
 * 电脑接口
 *
 * @author lixin
 */
public interface IComputer {

    /*** 额定电压 */
    Integer RATED_V = 15;

    /**
     * 输入电源
     *
     * @param power 电源
     * @throws IllegalArgumentException 电流电压参数异常
     * @author "miaopasi"
     */
    void inPower(IPower power) throws IllegalArgumentException;

    /**
     * 电脑状态
     *
     * @return false 未通电,true通电
     */
    boolean status();

    /**
     * 初始化电脑
     *
     * @throws InterruptedException 初始化异常
     * @author "miaopasi"
     */
    void init() throws InterruptedException;
}

/**
 * 电脑现实类
 *
 * @author lixin
 */
public class Computer implements IComputer {

    /*** 通电状态 */
    private Boolean status = Boolean.FALSE;

    @Override
    public void inPower(IPower power) throws IllegalArgumentException {
        if (power.outPower() > RATED_V) {
            throw new IllegalArgumentException("电源输入电压过高");
        }
        if (power.outPower() < RATED_V) {
            throw new IllegalArgumentException("电源输入电压过低");
        }
        this.status = true;
    }

    @Override
    public boolean status() {
        return this.status;
    }

    @Override
    public void init() throws InterruptedException {
        System.out.println("初始化电脑中...");
        Thread.sleep(2000);
        System.out.println("初始化电脑完成...");
    }
}

现在我们创建一个测试类

/**
 * 测试能否开机
 *
 * @author lixin
 */
public class Demo {

    public static void main(String[] args) throws InterruptedException {
        // 创建一台电脑
        IComputer computer = new Computer();

        // 标准电压,可以直接给电脑使用
        computer.inPower(new Power());

        // 初始化电脑
        computer.init();

        // 查看状态,电压异常会抛出异常
        System.out.println(computer.status());
    }
}

// 输出
初始化电脑中...
初始化电脑完成...
true

现在用户提供了一个220V的电源,我们电脑不能使用它,我们需要一个电源适配器来吧220V电源转化为标准电压。

/**
 * 新的电源接口
 *
 * @author lixin
 */
public interface IPower2 {
    /**
     * 输出电源
     *
     * @return 返回电压
     * @author "miaopasi"
     */
    long outPower();
}

/**
 * 电源实现类
 *
 * @author lixin
 */
public class Power220V implements IPower2 {
    /**
     * 直插电压
     *
     * @return 输出220V电压
     */
    @Override
    public long outPower() {
        return 220L;
    }
}

/**
 * 电脑电源适配器
 *
 * @author lixin
 */
public class PowerAdapter implements IPower {

    /*** 需要适配的电源 */
    private final IPower2 power;

    public PowerAdapter(IPower2 power) {
        this.power = power;
    }

    @Override
    public int outPower() {
        int normalPower;
        System.out.println("计算机额定电压为:" + IComputer.RATED_V + "V");
        System.out.println("电压输入电压为:" + this.power.outPower() + "V");
        System.out.println("电压转换中...");
        normalPower = this.conversionVoltage(power.outPower());
        System.out.println("电压转换完成...");
        return normalPower;
    }

    /**
     * 把输入电压转化为额定电压
     *
     * @param in 输入电压
     */
    private int conversionVoltage(long in) {
        // 输入电压和额定电压一致的,不做如何操作
        if (in == IComputer.RATED_V) {
            System.out.println("电压正常,直接输出。");
        } else if (in < IComputer.RATED_V) {
            System.out.println("电压过低,电压:+" + (IComputer.RATED_V - in) + "V");
        } else {
            System.out.println("电压过高,电压:-" + (in - IComputer.RATED_V) + "V");
        }
        return IComputer.RATED_V;
    }
}

/**
 * 测试能否开机
 *
 * @author lixin
 */
public class Demo {

    public static void main(String[] args) throws InterruptedException {
        // 创建一台电脑
        IComputer computer = new Computer();

        // 电脑没法直接使用220V电源
        // computer.inPower(new Power220V());
        // 这时我们可以在中间插一个电源适配,把220V电压转化为电脑的标准电压15V
        IPower power = new PowerAdapter(new Power220V());
        computer.inPower(power);

        // 初始化电脑
        computer.init();

        // 查看状态,电压异常会抛出异常
        System.out.println(computer.status());
    }

}

// 输出
计算机额定电压为:15V
电压输入电压为:220V
电压转换中...
电压过高,电压:-205V
电压转换完成...
初始化电脑中...
初始化电脑完成...
true

原文地址:https://www.cnblogs.com/lixingwu/p/14022486.html