首页 > 编程语言 >03-JAVA设计模式-适配器模式

03-JAVA设计模式-适配器模式

时间:2024-04-09 21:31:56浏览次数:16  
标签:03 适配 适配器 模式 public 接口 设计模式 Adapter

适配器模式

设么是适配器模式

它属于结构型模式,主要用于将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。

适配器模式主要解决的是不兼容接口的问题。在软件开发中,经常会有这样的情况:我们有一个现有的类,它的接口(方法、属性等)不符合我们的需求,但我们又无法直接修改这个类(可能是因为它是第三方库的一部分,或者出于其他原因)。此时,我们可以使用适配器模式来“包装”这个类,使其具有我们期望的接口。

适配器模式的主要形式

  • 类适配器模式:通过多重继承的方式,适配器类继承自目标接口和适配者类。由于Java不支持多重继承(除了接口),因此在实际应用中,我们通常会使用对象组合的方式来实现类适配器模式的效果。
  • 对象适配器模式:适配器类持有适配者类的一个实例,并实现了目标接口。当客户端调用目标接口的方法时,适配器类会调用适配者类的相应方法。
    适配器模式的优点包括:

适配器模式特点

  • 提高了类的复用性:通过适配器,我们可以复用那些原本不兼容的类。
  • 增加了灵活性:适配器模式使得代码更加灵活,我们可以很容易地更换适配者类,而不需要修改客户端代码。
  • 遵循了“开闭原则”:适配器模式对修改关闭,对扩展开放。我们可以通过添加新的适配器类来支持新的适配者类,而不需要修改现有的代码。

然而,适配器模式也有其局限性。例如,如果适配者类的接口与目标接口的差别太大,那么适配器类的实现可能会变得非常复杂和难以维护。此外,如果过度使用适配器模式,可能会导致系统结构变得复杂和混乱。

类适配器

UML

在这里插入图片描述

  • Adaptee(适配者键盘)具有打印功能,但是由于是接口并不适用。
  • Target(目标接口)目标接口需要通过USB插入
  • Adapter(适配器)实现目标接口,重新输出方法(通过继承调用适配者输出方法)
  • 测试时,通过创建适配者Adapter调用目标接口方法即可实现调用Adaptee(适配者)相应方法

实现代码

Adaptee.java

// 这是需要被适配的类,它可能有一个不兼容的接口。
// 比如:不兼容USB接口的旧键盘
public class Adaptee {
    public void print(){
        System.out.println("键盘输出");
    }
}

Target.java

// 这是我们期望得到的接口。客户端针对这个接口编程,而不需要知道具体的实现细节
// 笔记本:USB接口
public interface Target {
    void handlePrint();
}

Adapter.java

// 类适配器
// 适配器:这是适配器模式的核心。适配器类实现了目标接口,并在内部持有适配者类的一个实例。
// 当客户端调用目标接口的方法时,适配器类会将调用委托给适配者类的相应方法(可能需要经过一些转换)。
public class Adapter extends Adaptee implements Target{
    @Override
    public void handlePrint() {
        super.print();
    }
}

TestClient.java

public class TestClient {
    public static void main(String[] args) {
        // 创建适配器
        Adapter adapter = new Adapter();
        // 测试
        adapter.handlePrint();
    }
}

执行结果

在这里插入图片描述

对象适配器模式

UML

在这里插入图片描述

该模式只需要修改Adapter(适配器),将继承改为对象组合。将Adapter属性设置为Adaptee,通过Adaptee调用其方法
Adapter.java

// 对象适配器模式
// 适配器:这是适配器模式的核心。适配器类实现了目标接口,并在内部持有适配者类的一个实例。
//当客户端调用目标接口的方法时,适配器类会将调用委托给适配者类的相应方法(可能需要经过一些转换)。
public class Adapter implements Target {
    private Adaptee adaptee;
    @Override
    public void handlePrint() {
        adaptee.print();
    }
}

执行结果:
在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

标签:03,适配,适配器,模式,public,接口,设计模式,Adapter
From: https://blog.csdn.net/u014331138/article/details/137517733

相关文章

  • 设计模式:责任链模式
    责任链模式是一种行为设计模式,允许你将请求沿着一条链传递,直到一个对象处理它为止。这种模式包含了一些处理对象,每个对象都包含逻辑来处理特定类型的命令或请求。如果一个对象不能处理该请求,它就会将请求传递给链中的下一个对象,如此类推。定义责任链模式通过定义一个对象......
  • UI自动化之设计模式--关键字驱动设计
    UI自动化测试框架:1.关键字驱动设计2.Excel数据驱动设计3.框架实现UI测试框架之设计模式:(一)设计模式介绍1.目前主流的测试框架的设计模式:*1.1关键字驱动:最核心,最传统的设计模式。基于关键字的形态来实现对业务的自动化执行。通过操作行为的封装或者是通过业务流程的封装......
  • 瑞_23种设计模式_备忘录模式(快照模式)
    文章目录1备忘录模式(MementoPattern)★1.1介绍1.2概述1.3备忘录模式的结构1.4备忘录模式的优缺点1.5备忘录模式的使用场景2案例一2.1需求2.2“白箱”备忘录模式2.3“黑箱”备忘录模式★★★3案例二3.1需求3.2代码实现......
  • 了解python中的if __name__ == '__main__':
    在Python中,if__name__=='__main__': 是一个常见的结构,用于确定一个Python脚本是作为独立的程序运行还是被导入为模块。__name__ 是一个内置变量,它表示当前模块的名字。当一个Python文件(例如 script.py)被直接运行时,__name__ 的值会被设置为 '__main__'。当这个P......
  • 贝叶斯定理推导(Bayes's Theorem)
    这里用文氏图(Venn diagram)来推导一下贝叶斯定理。 假设A和B为两个不相互独立的事件。 交集(intersection): 上图红色部分即为事件A和事件B的交集。 并集(union):  由Venndiagram可以看出,在事件B已经发生的情况下,事件A发生的概率为事件A和事件B的交集除以事件B: ......
  • 移除链表元素(虚拟节点法、力扣203)
    题目给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],val=......
  • java设计模式回忆录
    java设计模式一.概念:在软件开发过程中的,经过验证的,在特定环境下重复发生特定问题的解决方案二.原则:OOP七项原则solid五项:功能的单一职责原则、开闭原则(便于扩展)、里氏替代原则(子类内代替父类)、接口隔离原则、依赖导致原则(依赖接口)迪米特原则(最小知道原则)、合成复用原则(用组合......
  • @行业应用:德国ARIS Nano S-DC 10-03电动执行器
    @行业应用:德国ARISNanoS-DC10-03电动执行器@行业应用:德国ARISNanoS-DC10-03电动执行器@行业应用:德国ARISNanoS-DC10-03电动执行器LinearisN+机电阻尼器执行器LinearisN+将zuixianjin的和用户友好的线性技术与当代设计中的经典驱动技术相结合。带有dryspin......
  • STM32F103C8T6 技术参数和性能特点
    STM32F103C8T6是意法半导体(STMicroelectronics)生产的一款基于ARMCortex-M3内核的32位微控制器。它具有以下主要功能: 1.ARMCortex-M3内核:STM32F103C8T6采用32位ARMCortex-M3内核,工作频率最高可达72MHz,提供较高的处理能力。 2.存储器:内置高达64kB的闪......
  • LeetCode 面试经典150题---003
    ####55.跳跃游戏给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。1<=nums.length<=1040<=nums[i]<=105本题题意比较明确,我们可以......