• 03.02-适配器模式(Adapter)


    1. 基本介绍

    1. 将某个接口转换成客户端期望的另一个接口表示,主要是为了兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作
    2. 适配器模式分为类适配器模式对象适配器模式

    2. 结构

    包含以下主要角色

    1. 目标接口 : (target)

    当前业务所期待的接口,可以是抽象类或者接口

    1. 适配者类 : (Adaptee) 被适配者

    也就是被适配的类, 和现在需要的接口不兼容的类
    被访问和适配的现存组件库中的组件接口

    1. 适配器类 : (Adapter)

    一个转换器, 通过继承(类适配模式) 或者 引用适配者类的对象(对象适配模式) ,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者


    3. 实现的例子

    手机充电需要5V的电压(目标接口/需求) ,
    家里插座输出的是220V的电压(适配者类/被适配者),
    需要手机充电器(适配器类)把220V的电压转船成5v手机可用的电压

    1. 类适配模式

    • 定义一个适配器类来实现当前的业务接口,同时又继承现有组件库中已经存在的组件

    在这里插入图片描述


    • 目标接口 (target)

    需求是输出5V的电压

    public interface Volatge5V {
        int output5V();
    }
    
    • 1
    • 2
    • 3

    • 适配者类 (adaptee)

    被适配的类 , 220V用不了呀…

    // 被适配的类
    public class Voltage220V {
        public int output220V(){
            int src = 220;
            System.out.println(" 类适配模式:电压="+ src);
            return src;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    • 适配器类(Adapter)

    转换加工 把220V 变成手机可用的5v电压
    因为是类适配器模式, 所以这个适配器继承自适配者
    且实现了 目标接口 的输出5V电压的方法

    // 适配器类
    // 继承自被适配的类 并且实现了转换电压的接口方法
    // 对 220V 的输入结果 进行转化 变成手机可以使用的电压
    public class VolatgeAdapter extends Voltage220V  implements Volatge5V {
        
        @Override
        public int output5V() {
            int src = output220V();// 父类的方法
            int dst = src / 44;
            System.out.println("类适配模式 :适配器 转换电压=" + dst);
            return dst;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    • 手机

    使用输出的5V电压

    public class Phone {
        public void charging(Volatge5V volatge5V){
            int res = volatge5V.output5V();
            if (res == 5){
                System.out.println("电压为5V,可以充电");
            }else {
                System.out.println("电压不是5V,不能充电!!!");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    • client

    用手机充电

    public static void main(String[] args) {
           Phone phone = new Phone();
            phone.charging(new VolatgeAdapter());
        }
    
    • 1
    • 2
    • 3
    • 4

    从用户角度看不到适配者 , 是解耦的.
    用户只要有能输出5v的手机充电器就可以了,插座的220V电压哪来的,怎么来的,都不用关心.只关心是不是输出5V可以用就行了.

    2.对象适配器模式

    类适配器模式是用了继承的方式,
    对象适配器模式用了聚合的方式来获得适配者类的对象.组合也可以,但是耦合度高一些.

    两种方式都是为了得到那220V的输入电压,也就是客户端用不了的那个接口. 获得后再转换成客户端能用的接口

    在这里插入图片描述


    • 代码相差不大

    原来是继承 适配者 , 适配器自身有了输出220V的方法
    现在是获得到 适配者对象 , 调用输出220V的方法

    // 适配器类
    // 继承自被适配的类 并且实现了转换电压的接口方法
    // 对 220V 的输入结果 进行转化 变成手机可以使用的电压
    public class VolatgeAdapter  implements  Volatge5V{
        private  Voltage220V voltage220V;
        public VolatgeAdapter(Voltage220V voltage220V){
            this.voltage220V = voltage220V;
        }
    
        @Override
        public int output5V() {
            int src = this.voltage220V.output220V();
            int dst = src / 44;
            System.out.println("对象适配 :适配器 转换电压=" + dst);
            return dst;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 优缺点

    • 优点
    1. 单一职责原则

    可以将接口或数据转换代码从程序主要业务逻辑中分离

    1. 开闭原则

    可以再不修改客户端代码的情况下在程序中添加新类型的适配器

    • 缺点

    代码的复杂度增加了

  • 相关阅读:
    吴恩达机器学习-未分级实验:使用ScikitLearn进行逻辑回归(Logistic Regression using Scikit-Learn)
    免费最强下载工具IDM,没有之一
    KaiwuDB 内核解析 - SQL 查询的生命周期
    webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课
    [深入研究4G/5G/6G专题-45]: L3信令控制-1-软件功能和整体架构
    .NET高级技术_02委托、lambda、事件
    21天学Python --- 打卡2:Regular Expression
    代码随想录算法训练营第53天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和
    java判断word文件是否正常
    信息系统项目管理师(第四版)教材精读思维导图-第十章项目进度管理
  • 原文地址:https://blog.csdn.net/squallmouse/article/details/126107317