Java设计模式中的适配器模式

 更新时间:2024年01月15日 09:25:47   作者:Mu_Mu是一只小白  
这篇文章主要介绍了Java设计模式中的适配器模式, 适配器模式是将一个类的接口适配成用户所期待的,一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中,需要的朋友可以参考下

适配器模式

将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

使用场景:

1)系统需要使用现有的类,但现有的类却不兼容。

2)需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。

3)需要一个统一的输出接口,但是输入类型却不可预知。

角色:

  • Source:需要被适配的类、接口、对象,即Datas。
  • Destination:需要得到的类,Source通过适配得到的类对象,也就是我们期待得到的接口。
  • Adapter:适配器类,协调Source和Destination,使两者能够协同工作。

共有两类适配器模式:

  • 对象适配器模式: 在这种适配器模式中,适配器组合一个被适配类的实例。在这种情况下,适配器调用该实例方法并对方法进行适配
  • 类适配器模式: 这种适配器模式下,适配器继承需要自已适配的类。

模拟场景

家用电压为220v而手机充电器大概在5v,需要一个适配器去适配输入电压将220v变为5v。

类适配器模式

被适配的类

/**
 * @Description source类,需要被适配。
 */
public class AC220 {

    public int output220(){
       //输出220v电压
        return 220;
    }

}

目标类:

/**
 * @Description 目标类输出5v电压
 */
public interface OP5 {

      int output5v();
}

适配类:

public class PowerAdapter extends AC220 implements OP5{
    @Override
    public int output5v() {
        System.out.println("适配5v开始");
         int i = output220();
         return i/44;
    }
}

测试类:

  @Test
    public void testClassAdapt(){
        PowerAdapter powerAdapter = new PowerAdapter();
        System.out.println("适配后的输出:"+powerAdapter.output5v());
    }

测试结果

得到5v输入电压。

在这里插入图片描述

由于java是单继承,所以这种通过继承被适配类的方式不太灵活,而且继承会让适配器暴露出被适配类的方法。

对象适配器模式

只有适配器类不同

public class PowerAdapter2   implements OP5 {
    public PowerAdapter2(AC220 ac220) {
        this.ac220 = ac220;
    }

    private AC220 ac220;
    @Override
    public int output5v() {
        System.out.println("适配5v开始");
         int i = ac220.output220();
         return i/44;
    }
}

测试类:

  @Test
    public void testObjAdapt(){
        PowerAdapter2 powerAdapter = new PowerAdapter2(new AC220());
        System.out.println("适配后的输出:"+powerAdapter.output5v());
    }

测试结果

结果一致

在这里插入图片描述

这种模式和装饰者模式有点类似,但是装饰者是为了去扩展被装饰者的功能,并且使用者无法感觉到方法被装饰,适配器模式主要为了更好的兼容和扩展,使用者能感受到适配器的存在。

到此这篇关于Java设计模式中的适配器模式的文章就介绍到这了,更多相关Java适配器模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springmvc @ResponseStatus和ResponseEntity的使用

    springmvc @ResponseStatus和ResponseEntity的使用

    这篇文章主要介绍了springmvc @ResponseStatus和ResponseEntity的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot手写starter全过程

    SpringBoot手写starter全过程

    本文主要介绍了如何手动编写SpringBoot的starter,包括创建项目、配置自动配置类、编写Properties文件、配置spring.factories文件等步骤,并通过测试项目验证其功能,同时,还讨论了如何实现开关控制等功能
    2026-05-05
  • Java的BigDecimal在math包中提供的API类场景使用详解

    Java的BigDecimal在math包中提供的API类场景使用详解

    这篇文章主要介绍了Java的BigDecimal在math包中提供的API类场景使用详解,BigDecimal,用来对超过16位有效位的数进行精确的运算,双精度浮点型变量double可以处理16位有效数,在实际应用中,需要对更大或者更小的数进行运算和处理,需要的朋友可以参考下
    2023-12-12
  • 基于Spring MVC的文件上传和下载实现方法

    基于Spring MVC的文件上传和下载实现方法

    在Web应用程序中,文件上传和下载是常见的功能,Spring MVC框架提供了方便的方式来实现这些功能,本文将介绍如何使用Spring MVC实现文件上传和下载,需要的朋友可以参考下
    2023-05-05
  • Springboot实现WebMvcConfigurer接口定制mvc配置详解

    Springboot实现WebMvcConfigurer接口定制mvc配置详解

    这篇文章主要介绍了Springboot实现WebMvcConfigurer接口定制mvc配置详解,spring boot抛弃了传统xml配置文件,通过配置类(标注@Configuration的类,@Configuration配置类相当于一个xml配置文件)以JavaBean形式进行相关配置,需要的朋友可以参考下
    2023-09-09
  • 详解Java的面向对象和面向过程

    详解Java的面向对象和面向过程

    我们知道,Java是面向对象的编程语言,但是至今仍有不少同学还不太懂”面向对象“的确切含义,今天这篇文章就带大家真正地认识面向对象,感兴趣的同学可以跟着小编一起来学习
    2023-05-05
  • Java使用wait和notify实现线程之间的通信

    Java使用wait和notify实现线程之间的通信

    Java 线程通信是将多个独立的线程个体进行关联处理,使得线程与线程之间能进行相互通信,下面这篇文章主要给大家介绍了关于Java使用wait和notify实现线程之间通信的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java中&与&&的区别及说明

    Java中&与&&的区别及说明

    这篇文章主要介绍了Java中&与&&的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 解决cmd执行javac报错:不是内部或外部命令,也不是可运行的程序

    解决cmd执行javac报错:不是内部或外部命令,也不是可运行的程序

    刚接触JAVA的新手可能就不知道怎么解决'JAVAC'不是内部命令或外部命令,这篇文章主要给大家介绍了关于解决cmd执行javac报错:不是内部或外部命令,也不是可运行的程序的相关资料,需要的朋友可以参考下
    2023-11-11
  • java:无法访问org.springframework.boot.SpringApplication问题

    java:无法访问org.springframework.boot.SpringApplication问题

    这篇文章主要介绍了java:无法访问org.springframework.boot.SpringApplication问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论