美文网首页
适配器模式,谈一下你对它的理解吧?

适配器模式,谈一下你对它的理解吧?

作者: 程就人生 | 来源:发表于2022-03-02 22:18 被阅读0次

适配器模式,在项目里经常用到吧!说一说都在什么地方,用到了适配器模式?对它的理解,能有多少呢?能说出多少呢?遇到问题又能解决多少呢?被这一连串问题炮轰,还能对答如流的,肯定是高手了,不要羡慕别人了,现在就开始理解一下吧!适配器模式,将一个类的接口转换为客户需要的接口,使原本不兼容的类可以一起工作,属于结构型模式。

图片

业务场景:不同产品、不同厂家,功能类似,而接口不同的问题。

适配器模式分类:类适配对象适配、接口适配三种形式

一、类适配模式编码

业务场景说明:生活用电是220v,而手机充电是5v,那么如何给手机充电呢,那就需要一个手机充电的适配器。

1.定义电压接口;

/**
 * 1.电压接口
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public interface IVoltage {
  //输出电压
  public int output();
}

2.生活中用电的实现类;

/**
 * 2.生活中的电压
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public class LifeVoltage implements IVoltage {  

  private static final int voltage = 220;

  @Override
  public int output() {
    return voltage;
  }

}

3.家电接口;

/**
 * 3.家电接口
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public interface IHomeAppliance {
    // 充电,接入电源
  public void charge(int voltage);
}

4.手机是家电的实现类;

/**
 * 4.手机是家电的一种
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public class MobilePhone implements IHomeAppliance{

  private static final int mobileVoltage = 5;
  
  @Override
  public void charge(int voltage) {
    if(voltage == mobileVoltage){
      System.out.println("手机可以正常充电,电压为5V");
    }else{
      System.out.println("手机不能正常充电,电压为" + voltage + "V");
    }
  }  
}

5.手机充电适配器;

/**
 * 5.1 手机充电器(适配器)---- 类适配器
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public class MobilePhoneChargerAdapter extends LifeVoltage implements IVoltage {
  @Override
  public int output(){
    int liftVoltage = super.output();
    int mobilePhoneValtage = liftVoltage / 44;
    return mobilePhoneValtage;
  }
}

6.应用,给手机充电;

public static void main(String[] argo){ 
    // 类适配器测试
    MobilePhoneChargerAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter();
    // 创建一个手机对象
    IHomeAppliance mobilePhone = new MobilePhone();
    // 给手机充电,使用类适配器获取电压
    mobilePhone.charge(mobilePhoneChargerAdapter.output());
  }

测试结果:

手机可以正常充电,电压为5V

二、对象适配模式****编码;

同样的业务场景,只是在适配类上有所区别:与被适配器类的关系,由泛化关系(继承)变为依赖关系(组合或聚合)

5.手机充电适配类,看关键代码;

/**
 * 5.2 手机充电器(适配器)---- 对象适配器
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public class MobilePhoneChargerAdapter implements IVoltage {

  private LifeVoltage lifeVoltage;
  
  public MobilePhoneChargerAdapter(LifeVoltage lifeVoltage) {
    this.lifeVoltage = lifeVoltage;
  }
  
  @Override
  public int output() {
    int liftVoltage = lifeVoltage.output();
    int mobilePhoneValtage = liftVoltage / 44;
    return mobilePhoneValtage;
  }
}

说明:被适配类是LifeVoltage ,在类适配中是继承;而在对象适配模式中,变成了依赖,在实例化适配类时传入。

6.应用,给手机充电;

public static void main(String[] argo){
    // 获取手机充电适配器,并传入生活用电
    MobilePhoneChargerAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter(new LifeVoltage());
    // 使用电压
    IHomeAppliance mobilePhone = new MobilePhone();
    // 对象适配器
    mobilePhone.charge(mobilePhoneChargerAdapter.output());    
  }

测试结果:

手机可以正常充电,电压为5V

三、接口适配模式编码;

接口适配器模式,也是缺省适配器模式。三句话,三个要点:

1)当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口。

2)在抽象类中,为接口中每个方法提供一个默认的空方法实现。

3)最后,该抽象类的子类就可以有选择地覆盖父类的某些方法来实现需求。

5.电压适配接口;

/**
 * 5.电压适配器接口
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public interface IVolatageAdapter {  
   // 适配220电压
   public int voltage220v();
   // 适配5v电压
   public int voltage5v();   
}

6.电压抽象接口实现了电压适配接口,并在每个方法中提供一个默认的空实现。

/**
 * 6.抽象类实现接口---空实现
 * @author FengJuan
 * @date 2022年2月25日
 * @Description 
 *
 */
public abstract class AbstractAdapter implements IVolatageAdapter{

  @Override
  public int voltage220v(){
    return 0;
  }
  
  @Override
  public int voltage5v(){
    return 0;
  }
}

7.手机充电适配器的实现;

/**
   * 7. 手机充电器(适配器)---接口适配器
   * @author FengJuan
   * @date 2022年2月25日
   * @Description 
   *
   */
  public class MobilePhoneChargerAdapter extends AbstractAdapter{
    
    @Override
    public int voltage5v(){
      // 简化编码,直接返回
      return 5;
    }    
  }

8.应用,给手机使用适配器充电;

public static void main(String[] argo){
    // 获取手机充电适配器
    IVolatageAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter();
    // 使用电压
   IHomeAppliance mobilePhone = new MobilePhone();
    // 接口适配器
    mobilePhone.charge(mobilePhoneChargerAdapter.voltage5v());
  }

测试结果:

手机可以正常充电,电压为5V

回到最初的问题,项目中哪些地方用到了适配器模式?它们大多数又都使用了哪种类型的适配器模式?

感觉有用,请关注同名公众号吧~!

相关文章

  • 适配器模式,谈一下你对它的理解吧?

    适配器模式,在项目里经常用到吧!说一说都在什么地方,用到了适配器模式?对它的理解,能有多少呢?能说出多少呢?遇到问...

  • 学习iOS设计模式第一章 适配器(Adapter)

    今天学习了iOS设计模式中的适配器模式,适配器有两种模式对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包...

  • 适配器模式学习

    适配器模式学习 理解 看了YouXianMing的github感觉需要加深一下印象。 使用适配器的前提是之前有一套...

  • centos离线安装CDH(2.1): 虚拟机环境准备

    vmware网络适配器使用桥接模式 网桥模式是我最喜欢的用的一种模式,同时,模拟度也是相当完美。你可以这样理解,它...

  • 设计模式(java)- 模版方法模式

    之前学习的是适配器模式与外观模式。 对外观模式与适配器模式的理解 适配器模式的意思就是适配,将三孔插座转换为二孔插...

  • 设计模式之适配和装饰

    1. 适配器模式 通过一个简单的例子说一下适配器模式,适配器模式属于接口型模式。适配器模式的意图在于,使用不同接口...

  • 适配器模式

    1、 适配器模式介绍 适配器模式,也叫Adapter或者Wrapper设计模式,根据字面意思来理解,就是为了达到适...

  • 适配器模式(Adapter)

    网上看到不少关于适配器模式的讲解,其中对于适配器模式解释的过于专业,一时不是特别理解适配器模式到底是用来干嘛的,具...

  • 优雅的实现接口转换——Java 适配器模式详解

    项目4说的是适配器,Peter老师也总结一下Java中的适配器模式。 适配器模式(Adapter Pattern)...

  • Java设计模式—适配器模式

    一、定义 共有两类适配器模式 对象适配器模式在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配...

网友评论

      本文标题:适配器模式,谈一下你对它的理解吧?

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