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

设计模式:适配器模式

作者: 谁家的猪 | 来源:发表于2019-08-03 08:27 被阅读0次

    定义与类型

    • 定义:将一个类的接口转换成客户期望的另一个接口
    • 使原本接口不兼容的类可以一起工作
    • 类型:结构型

    适用场景

    • 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
    • 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不同情况下的解决方案

    优点

    • 能够提高类的透明性和复用,现有类复用但不需要改变
    • 目标类和适配器类解耦,提高程序扩展性
    • 符合开闭原则

    缺点

    • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
    • 增加系统代码可读的难度

    扩展

    • 对象适配器
    • 类适配器

    相关设计模式

    • 适配器模式和外观模式

    代码演示

    类适配器

    1. 创建被适配者
    /**
     * @author lijiayin
     */
    public class Adaptee {
        
        public void adapteeRequest(){
            System.out.println("被适配者的方法");
        }
    }
    
    1. 创建需要适配的接口
    /**
     * @author lijiayin
     */
    public interface Target {
        void request();
    }
    
    1. 创建适配器
    /**
     * @author lijiayin
     */
    public class Adapter extends Adaptee implements Target {
        @Override
        public void request() {
            super.adapteeRequest();
        }
    }
    
    1. 测试一下
    /**
     * @author lijiayin
     */
    public class Test {
    
        public static void main(String[] args) {
            Target adapterTarget = new Adapter();
            adapterTarget.request();
        }
    }
    
    1. 测试结果


      测试结果.png
    2. UML图


      UML.png

    对象适配器

    1. 修改Adapter类
    /**
     * @author lijiayin
     */
    public class Adapter implements Target {
        
        private Adaptee adaptee = new Adaptee();
        
        @Override
        public void request() {
            adaptee.adapteeRequest();
        }
    }
    
    1. 测试一下


      测试结果.png
    2. UML图


      UML.png

    将220V交流电转为5V直流电

    1. 创建AC220类
    /**
     * @author lijiayin
     */
    public class AC220 {
        public int outputAC220V(){
            int output = 220;
            System.out.println("输出交流电" + output + "V");
            return output;
        }
    }
    
    1. 创建需要实现的接口DC5
    /**
     * @author lijiayin
     */
    public interface DC5 {
        int outputDC5V();
    }
    
    1. 创建适配器
    /**
     * @author lijiayin
     */
    public class PowerAdapter implements DC5 {
        private AC220 ac220 = new AC220();
        
        @Override
        public int outputDC5V() {
            int adapterInput = ac220.outputAC220V();
            //变压器(适配逻辑)
            int adapterOutput = adapterInput / 44;
            System.out.println("使用PowerAdapter,将输入AC" + adapterInput + "V,转为输出DC" + adapterOutput + "V");
            return adapterOutput;
        }
    }
    
    1. 测试一下
    /**
     * @author lijiayin
     */
    public class Test {
        public static void main(String[] args) {
            DC5 dc5 = new PowerAdapter();
            dc5.outputDC5V();
        }
    }
    
    1. 测试结果


      测试结果.png

    框架源码

    1. jdk中的XmlAdapter
    2. spring下的AdvisorAdapter
    3. jpa中的JpaVendorAdapter

    相关文章

      网友评论

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

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