美文网首页
Java设计模式之适配器模式

Java设计模式之适配器模式

作者: mundane | 来源:发表于2021-06-22 21:51 被阅读0次

    基本介绍

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

    类适配器模式

    基本介绍:
    Adapter类, 通过继承src类, 实现dst类接口, 完成src -> dst的适配
    应用实例说明:
    以充电器的例子讲解适配器, 充电器相当于adapter, 220V交流电相当于src(即被适配者), 我们的dst(即目标)是5V直流电

    上代码:
    src

    public class Voltage220V {
    
        // 输出220V电压
        public int output220V() {
            int src = 220;
            System.out.println("电压 = " + src + "伏");
            return src;
        }
    }
    

    adapter

    // 适配器类
    public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    
        @Override
        public int output5V() {
            // 获取到220V电压
            int srcV = output220V();
            // 转成5V
            int dstV = srcV/44;
    
            return dstV;
        }
    }
    

    这里顺便列一下IVoltage5V这个接口的代码:

    public interface IVoltage5V {
        int output5V();
    }
    

    电话, 使用的是5V直流电

    public class Phone {
    
        // 充电
        public void charging(IVoltage5V iVoltage5V) {
            if (iVoltage5V.output5V() == 5) {
                System.out.println("电压为5V, 可以充电");
            } else if (iVoltage5V.output5V() > 5) {
                System.out.println("电压大于5V, 不能充电");
            }
        }
    }
    

    使用:

    public class Client {
        public static void main(String[] args) {
            System.out.println("=====类适配器模式======");
            Phone phone = new Phone();
            phone.charging(new VoltageAdapter());
        }
    }
    

    对象适配器模式

    基本介绍:
    adapter类持有src类, 实现dst接口, 完成src -> dst的适配
    根据合成复用原则, 尽量使用关联关系来替代继承关系
    上代码:
    adapter:

    public class VoltageAdapter implements IVoltage5V {
    
        private Voltage220V voltage220V;
    
    
        public VoltageAdapter(Voltage220V voltage220V) {
            this.voltage220V = voltage220V;
        }
    
        @Override
        public int output5V() {
            int dst = 0;
    
            if (voltage220V != null) {
                int src = voltage220V.output220V();
                System.out.println("使用对象适配器进行适配");
                dst = src / 44;
                System.out.println("适配完成, 输出电压为" + dst);
            }
    
            return dst;
        }
    }
    

    客户端使用:

    public class Client {
        public static void main(String[] args) {
            System.out.println("=====对象适配器模式======");
            Phone phone = new Phone();
            phone.charging(new VoltageAdapter(new Voltage220V()));
        }
    }
    

    其他的代码不变

    接口适配器模式

    基本介绍:
    接口适配器模式也叫缺省适配器模式。
    当不需要全部实现接口提供的方法时, 可先设置一个抽象类实现接口, 并为该接口中的每一个方法提供一个默认实现(空方法), 该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求。
    上代码:

    public interface Interface4 {
    
        void m1();
    
        void m2();
    
        void m3();
    
        void m4();
    }
    
    public abstract class AbsAdapter implements Interface4{
        @Override
        public void m1() {
    
        }
    
        @Override
        public void m2() {
    
        }
    
        @Override
        public void m3() {
    
        }
    
        @Override
        public void m4() {
    
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            AbsAdapter adapter = new AbsAdapter() {
                @Override
                public void m1() {
                    System.out.println("使用了m1方法");
                }
            };
    
            // todo 把这个adapter传入到方法中当做参数去使用
        }
    }
    

    适配器模式在SpringMVC框架应用的源码分析

    SpringMVC中的HandlerAdapter, 使用了适配器模式。
    为了更加理解, 我们可以自己动手写SpringMVC通过适配器设计模式获取到对应的Controller的源码。

    说明:

    • Spring定义了一个适配接口, 使得每一种Controller有一种对应的适配器实现类
    • 适配器代替Controller执行相应的方法
    • 扩展Controller时, 只需要增加一个适配器类就完成了SpringMVC的扩展

    总结

    三种命名方式, 是根据src以怎样的形式给到adapter
    类适配器: 以类给到, 在adapter里, 就是将src当做类, 继承
    对象适配器: 以对象给到, 在adapter里, 将src作为一个对象, 持有
    接口适配器: 以接口给到, 在adapter里, 将src作为一个接口, 实现

    代码地址

    https://github.com/mundane799699/DesignPattern

    参考:

    尚硅谷Java设计模式(图解+框架源码剖析)

    相关文章

      网友评论

          本文标题:Java设计模式之适配器模式

          本文链接:https://www.haomeiwen.com/subject/lowmyltx.html