首页 > 编程语言 >Java设计模式——适配器模式

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

时间:2024-10-19 23:46:02浏览次数:11  
标签:Java HDMI 适配 适配器 VGA 接口 模式 设计模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换成客户端希望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作。适配器模式的主要目的是兼容性和重用性,特别是在使用一些已有的类,而它们的接口又不符合要求时。

适配器模式的核心思想

适配器模式的核心是将一个类的接口转换为客户端期望的另一个接口,从而实现类之间的兼容。它就像是一个“适配器插头”,可以让本来不兼容的接口顺利对接。

适配器模式的两种类型

  1. 类适配器模式(使用继承实现)

  2. 对象适配器模式(使用组合实现)

1. 类适配器模式

类适配器模式使用继承的方式来实现适配器。它通过继承一个已有的类,并实现目标接口,使得适配器可以“表现”成目标接口的类型。

优点:可以实现多个适配器之间的灵活转换。通过继承,可以直接访问被适配类的方法。

缺点:适配器类需要继承已有类,这限制了适配器类的灵活性,因为 Java 等语言中不支持多重继承,所以一个适配器类最多只能适配一个类。适配器与被适配类之间的耦合度较高。

示例: 假设有一个VGA接口,但现在需要一个HDMI接口来连接显示器,可以创建一个VGAAdapter类来继承VGA接口,并实现HDMI接口。

// HDMI接口
interface HDMI {
    void connectWithHDMI();
}

// VGA类
class VGA {
    void connectWithVGA() {
        System.out.println("使用VGA链接");
    }
}

// VGA到HDMI的适配器
class VGAAdapter extends VGA implements HDMI {
    @Override
    public void connectWithHDMI() {
        connectWithVGA(); // 调用VGA的方法实现HDMI的功能
        System.out.println("调用HDMI");
    }
}
2. 对象适配器模式

对象适配器模式使用组合的方式,将已有类的实例作为适配器的一个成员变量,通过调用这个实例的方法来完成适配。对象适配器模式更常用,因为它更加灵活,可以动态组合不同的适配器对象。

  • 优点

    • 适配器与被适配类之间的耦合度较低,可以适配多个不同的类。
    • 可以实现多个类的适配,只要这些类实现了适配器中的方法。
  • 缺点

    • 需要在适配器中维护被适配对象的实例,会稍微增加复杂性。

示例: 以同样的VGA和HDMI接口为例,我们可以使用对象适配器模式来实现适配器。

// HDMI接口
interface HDMI {
    void connectWithHDMI();
}

// VGA类
class VGA {
    void connectWithVGA() {
        System.out.println("使用VGA");
    }
}

// VGA到HDMI的适配器(使用组合)
class VGAAdapter implements HDMI {
    private VGA vga;

    VGAAdapter(VGA vga) {
        this.vga = vga;
    }

    @Override
    public void connectWithHDMI() {
        vga.connectWithVGA(); // 使用VGA对象的方法
        System.out.println("采用HDMI");
    }
}

适配器模式的应用场景

适配器模式非常适合在以下场景中使用:

  1. 希望复用一些现有的类,但这些类的接口不符合你的需求时。
  2. 需要将多个不兼容的接口集成到一个接口中时,可以使用适配器来封装。
  3. 使用第三方库时,库的接口不能直接满足系统的需求,可以创建一个适配器来连接现有系统与第三方库。
  4. 接口不兼容但功能相似的类之间,适配器可以帮助它们协同工作。

标签:Java,HDMI,适配,适配器,VGA,接口,模式,设计模式
From: https://blog.csdn.net/sdg_advance/article/details/143086525

相关文章

  • JavaScript中的this指向
    1.函数在调用时,JavaScript会默认给this绑定一个值;2.this的绑定和定义的位置(编写的位置)没有关系;3.this的绑定和调用方式以及调用的位置有关系;4.this是在运行时被绑定的;this的绑定规则规则一:默认绑定在函数独立调用时使用默认绑定,可以理解为函数没有被绑定到某个对象上常见......
  • Java的重载和主要内存区
    JAVA的重载​在Java中,重载(Overloading)是指在同一个类中可以定义多个同名的方法,但它们的参数列表必须不同。重载可以通过改变参数的数量、类型或者顺序来实现。重载提高了代码的可读性和灵活性。JAVA重载要满足的条件:在同一个类下:java的重载必须在同一个类之下方法名相同......
  • 【Java】Java面向对象与方法
    1.基本方法1.1.基本定义在Java中,方法即为函数,Java中的方法定义遵循下面的通用格式修饰符返回值方法名(形参列表){方法体}对于基本方法的定义,遵循下面的结构publicstatic返回类型方法名(形参列表){方法体}是否需要返回类型和形参列表需要看该......
  • Java21虚拟线程:我的锁去哪儿了?
    0前言最近的文章中,我们详细介绍了当我们迁移到Java21并将代际ZGC作为默认垃圾收集器时,我们的工作负载是如何受益的。虚拟线程是我们在这次迁移中兴奋采用的另一个特性。对虚拟线程新手,它们被描述为“轻量级线程,大大减少编写、维护和观察高吞吐量并发应用程序的工作量。”......
  • 【Java基础】物理内存&虚拟内存
    前言在Java程序运行过程中,操作系统为其分配了物理内存和虚拟内存。理解这两者的概念有助于明晰内存管理和性能优化。一、物理内存物理内存是指计算机的实际RAM(随机存取存储器)。Java进程在运行时需要向操作系统请求内存资源,操作系统通过分配物理内存来满足Java进程的内存......
  • java锁的问题速通
     1.syncronized底层原理——悲观锁synchronized有对象锁和类锁两种,多个线程中只有一个线程可以获取对象锁,其他线程都会处于阻塞状态synchronized是底层是基于monitor实现的。monitor是C++编写的jvm对象,主要分为owner(这个只会存一个线程的信息,记录当前锁被哪个线程获取了)、ent......
  • java反射机制
    什么是java反射呢,先来看Oracle官方的解释:“ReflectionenablesJavacodetodiscoverinformationaboutthefields,methodsandconstructorsofloadedclasses,andtousereflectedfields,methods,andconstructorstooperateontheirunderlyingcounterparts,......
  • [Java基础] 异常处理机制
    往期回顾[Java基础]基本数据类型[Java基础]运算符[Java基础]流程控制[Java基础]面向对象编程[Java基础]集合框架[Java基础]输入输出流[Java基础]异常处理机制[Java基础]Lambda表达式目录什么是异常处理?异常分类检查型异常非检查型异常(UncheckedExcepti......
  • java计算机毕业设计springboot+vue小区物业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加速,住宅小区的规模不断扩大,小区内的管理事务日益繁杂。传统的物业管理方式依赖人工操作,效率低下且容易出错。在信息技术飞速发......
  • java计算机毕业设计广告系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着互联网的迅猛发展,广告行业发生了翻天覆地的变化。广告形式和载体日益多样化,从传统的报纸、杂志、电视到如今无处不在的互联网广告等1。海量......