博客信息

适配器模式Adapter(结构模式)

发布时间:『 2019-03-22 05:27』  博客类别:23种设计模式  阅读(746)
  • 案例

    需求:电源适配的项目,要让手机能够使用220V的交流电;注意,手机只接受5.5V的电压;

  • 术语

    • source:待适配的类/对象/接口

    • Adapter:适配器

    • destination:适配后可用的类/对象/接口

  • 角色

    • source Power220V===》220V的电源

    • Adapter PowerAdapt===》电源适配器

    • Destination Power5V===》5V的电源

  • 分类

    • 类适配器模式 Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配。

    • 对象适配器模式 将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination 类接口,完成source->Destination 的适配

    • 接口适配器模式 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求 适用于一个接口不想使用其所有的方法的情况

适配器模式分类三种体现形式思想都大同小异,这里就只介绍最常用的 对象适配器模式;

  • 代码

    • 使用前

      package com.javaxl.design.adapter.before;

      /**
      * @author 小李飞刀
      * @site www.javaxl.com
      * @company
      * @create  2020-02-22 15:51
      *
      * 220V的电压
      */
      public class Voltage220V {
        private double voltage;

        public Voltage220V() {
            this.voltage = 220;
        }

        public double getVoltage() {
            return voltage;
        }

        public void setVoltage(double voltage) {
            this.voltage = voltage;
        }
      }


      public class Phone {
      //   充电
        public void charge(Voltage220V voltage220V){
            double voltage = voltage220V.getVoltage() / 40;
            System.out.println("最终手机充电所用电压:" + voltage + "V");
        }
      }


      public class Client {
        public static void main(String[] args) {
            Phone phone = new Phone();
      //       已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
      //       还一种方案:新增5V的一个Voltage5V,Voltage的电压可以被手机使用
      //       但是这违背现实生活现象,现实生活中只有220V的电源,其他的电源都是通过适配得来的
            phone.charge(new Voltage220V());
        }
      }

    • 使用后

 小李飞刀_设计模式



package com.javaxl.design.adapter.after;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-22 15:51
*
* 220V的电压
*/
public class Voltage220V {
  private double voltage;

  public Voltage220V() {
      this.voltage = 220;
  }

  public double getVoltage() {
      return voltage;
  }

  public void setVoltage(double voltage) {
      this.voltage = voltage;
  }
}

/**
* 目标接口
*/
interface Voltage5V{
  double getVoltage();
}

/**
* 适配器:里面封装了source源到destination目标的过程
*/
class VoltageAdapter implements Voltage5V{
  private Voltage220V voltage220V;

  public VoltageAdapter(Voltage220V voltage220V) {
      this.voltage220V = voltage220V;
  }

  @Override
  public double getVoltage() {
      return voltage220V.getVoltage() / 40;
  }
}


package com.javaxl.design.adapter.after;


public class Phone {
//   充电
  public void charge(Voltage5V voltage5V){
      double voltage = voltage5V.getVoltage();
      System.out.println("最终手机充电所用电压:" + voltage + "V");
  }
}


public class Client {
  public static void main(String[] args) {
      Phone phone = new Phone();
//       已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//       VoltageAdapter适配器对Voltage220V这个不能直接使用的电源适配后就可以使用了
      phone.charge(new VoltageAdapter(new Voltage220V()));
  }
}

  • 注意事项和细节

    Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作

  • 应用

    SpringMvc框架中HandlerAdapter类 安卓中监听适配器类中就使用了接口适配器(上拉、下拉...)


总结

  适配器模式有两种,我们需要根据实际情况来使用,在实际情况之中,我们可能使用一些已经封装好的代码,有的时候需要对其进行稍微的修改,可是这些代码同时被其他组件所使用,我们不能在原来的程序上改动,因此通过适配器模式,我们将这些代码进行进一步的处理,然后再使用,这样的设计方法是非常好的,因为我们保证了在不修改原来的代码的情况下实现了代码的复用和个性化。一般用在系统升级的时候,需要保证兼容性,我们将新系统作为被适配对象,通过自己定义的适配器保证在旧系统上依旧可以使用之前的功能,保证了兼容性。也用在使用别人的代码的时候。但是如果被适配的角色的功能和最终我们使用的功能完全不同时,适配器是不能使用的,不能将电流适配成水流的。


over......


关键字:     设计模式  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有