• 适配器模式


    基本介绍

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

    工作原理

    1. 适配器模式即将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容
    2. 从caller角度看不到适配者,是解耦的
    3. caller调用适配器转换出来的目标接口的方法,适配器再调用被适配者的相关接口
    4. caller收到反馈结果并不知道过程,感觉就是在与目标接口交互

    电压问题

    假设当前电源电压(src)为220V,而手机充电口需要的电压(dst)是5V,使用适配器将电压进行转换

    类适配器

    Adapter类通过继承src类,实现dst类接口,在dst接口中调用src中的方法,完成src->dst的适配

    类适配器解决电压问题

    /***
     * @author shaofan
     * @Description 类适配器解决电压问题
     */
    public class ClassAdapter {
        public static void main(String[] args) {
            Phone phone = new Phone();
            phone.charging(new VoltageAdapter());
        }
    }
    
    class Phone{
        public void charging(Voltage5V voltage5V){
            System.out.println("充电电压为"+voltage5V.output5V()+"V");
        }
    }
    class Voltage220V{
        int output220V(){
            return 220;
        }
    }
    interface Voltage5V{
        int output5V();
    }
    class VoltageAdapter extends Voltage220V implements Voltage5V{
    
        @Override
        public int output5V() {
            //将源电压转为目标电压5V
            int src = output220V();
            int dst = src/44;
            return dst;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    类适配器注意事项

    1. Java是单继承机制,所以类适配器需要继承src类算是一个缺点,因为这要求了dst只能是接口,有一定的局限性
    2. src类的方法在Adapter中都会暴露出来,也增加了使用的成本
    3. 由于继承了src类,所以可以根据需求重写src类的方法,增加了灵活性

    对象适配器

    1. 基本思路和类适配器相同,只是将Adapter类作修改,不再继承src类,而是根据合成复用原则,持有src类的实例,来解决兼容问题
    2. 对象适配器是常用的一种适配器模式

    对象适配器解决电压问题

    /***
     * @author shaofan
     * @Description 对象适配器解决电压问题
     */
    public class ObjectAdapter {
    
        public static void main(String[] args) {
            Phone phone = new Phone();
            phone.charging(new VoltageAdapter(new Voltage220V()));
        }
    }
    
    class Phone{
        public void charging(Voltage5V voltage5V){
            System.out.println("充电电压为"+voltage5V.output5V()+"V");
        }
    }
    
    class Voltage220V{
        int output220V(){
            return 220;
        }
    }
    
    interface Voltage5V{
        int output5V();
    }
    
    class VoltageAdapter implements Voltage5V {
        private Voltage220V voltage220V;
        public VoltageAdapter(Voltage220V voltage220V){
            this.voltage220V = voltage220V;
        }
    
        @Override
        public int output5V() {
            //将源电压转为目标电压5V
            int src = voltage220V.output220V();
            int dst = src/44;
            return dst;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    对象适配器注意事项

    1. 对象适配器和类适配器是同一种思想,只不过实现方式不同,根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口
    2. 使用成本更低,更灵活

    接口适配器模式

    1. 当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口中每一个方法提供一个默认实现(空方法),改抽象类的子类可以有选择的覆盖父类的某些方法
    2. 适用于一个接口不想使用其所有方法的情况

    接口适配器解决电压问题

    /***
     * @author shaofan
     * @Description 接口适配器解决电压问题
     */
    public class InterfaceAdapter {
    
        public static void main(String[] args) {
            Phone phone = new Phone();
            phone.charging();
        }
    }
    
    class Phone{
        public void charging(){
            // 在调用时只对需要用到的方法进行实现
            AbstractAdapter adapter = new AbstractAdapter() {
                @Override
                public int output5V() {
                    return 5;
                }
            };
            System.out.println("充电电压为"+adapter.output5V()+"V");
        }
    }
    
    interface Voltage{
        int output5V();
        int output3V();
    }
    
    /***
     * 适配器对接口中的方法进行空实现
     */
    abstract class AbstractAdapter implements Voltage{
        @Override
        public int output5V() {
            return 0;
        }
    
        @Override
        public int output3V() {
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    总结

    1. 适配器模式分为三类,是根据src是以怎样的形式给到Adapter来命名的
    2. 类适配器:以类给到,在Adapter将src当作类,继承;对象适配器:以对象给到,在Adapter将src作为一个对象,持有;接口适配器:以接口给到,在Adapter,将src作为一个接口,实现
    3. Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作
  • 相关阅读:
    【面试复习】Python基础复习
    LeetCode简单题之找到和最大的长度为 K 的子序列
    生物的神经系统与机器的人工神经网络
    Uniapp零基础开发学习笔记(11)-安装扩展组件uni-ui/uView及微信小程序开发环境
    第二证券|多只公募基金损失惨重;储能板块低开高走
    《RO 仙境传说》 Game Jam 获奖名单公布!
    源码框架-​1.Spring底层核心原理解析
    学习笔记5--高精地图技术
    6. 【图的存储结构】邻接矩阵、邻接表 、十字链表 、邻接多重表
    STK12与Python联合仿真(二):简单的例程
  • 原文地址:https://blog.csdn.net/m0_48468380/article/details/126165309