zoukankan      html  css  js  c++  java
  • 设计模式之 适配器模式

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

    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
    
    
  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/lixingwu/p/14022486.html
Copyright © 2011-2022 走看看