• 设计模式之 适配器模式


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

    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
    
    
  • 相关阅读:
    MySQL管理工具-SQLyog 9.63的使用详解
    通讯录管理系统
    Mavenx学习找对方法,快速上手!
    晚风花间寺中人
    PE重装系统,U盘重装系统,一步到位,重装无忧!
    进入博客园的第一篇随笔,贡献给我最喜欢的作家-大冰
    天地有情尽白发,人间无意了沧桑
    狼和羊的故事(安徒生新篇)
    .Net Core CLR GC的浅度分析
    .net core 的夸代扫描标记card_table的细节分析
  • 原文地址:https://www.cnblogs.com/lixingwu/p/14022486.html
Copyright © 2020-2023  润新知