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

    一、适配器模式介绍

    1、定义与类型

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

    2、适用场景

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

    3、优点

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

    4、缺点

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

    5、扩展

    对象适配器
    类适配器

    6、相关设计模式

    适配器模式和外观模式

    二、代码示例

    1、类适配器模式:

    被适配者类:

    public class Adaptee {
        public void adapteeRequest(){
            System.out.println("被适配者的方法");
        }
    }
    

    目标接口:

    public interface Target {
        void request();
    }
    

    具体目标类:

    public class ConcreteTarget implements Target {
        @Override
        public void request() {
            System.out.println("concreteTarget目标方法");
        }
    }
    

    适配器类:

    public class Adapter extends Adaptee implements Target{
        @Override
        public void request() {
            //...
            super.adapteeRequest();
            //...
        }
    }
    

    测试类:

    public class Test {
        public static void main(String[] args) {
            Target target = new ConcreteTarget();
            target.request();
    
            Target adapterTarget = new Adapter();
            adapterTarget.request();
        }
    }
    

    类图:

    2、对象适配器模式:

    被适配者、目标接口、具体目标类以及测试类相同
    适配器类:

    public class Adapter implements Target{
        private Adaptee adaptee = new Adaptee();
        @Override
        public void request() {
            //...
            adaptee.adapteeRequest();
            //...
        }
    }
    

    类图:

    3、模拟电源适配器:

    被适配者类:

    public class AC220 {
        public int outputAC220V(){
            int output = 220;
            System.out.println("输出交流电"+output+"V");
            return output;
        }
    }
    

    目标接口:

    public interface DC5 {
        int outputDC5V();
    }
    

    适配器类:

    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;
        }
    }
    

    测试类:

    public class Test {
        public static void main(String[] args) {
            DC5 dc5 = new PowerAdapter();
            dc5.outputDC5V();
        }
    }
    

    类图:

    三、源码示例

    1、JDK

    XmlAdapter

    2、SPRING

    AdvisorAdapter

  • 相关阅读:
    find文件后cp、rm
    值得加分的
    对老师的评价
    关于Statement 与 PreparedStatement
    每日日报2021.1.14
    每日日报2020.1.12
    每日日报2021.1.11
    给自己算的加分项
    期末了,给老师提建议。
    每日日报2020 12/19
  • 原文地址:https://www.cnblogs.com/weixk/p/12963051.html
Copyright © 2011-2022 走看看