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

适配器模式

设么是适配器模式

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

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

适配器模式的主要形式

  • 类适配器模式:通过多重继承的方式,适配器类继承自目标接口和适配者类。由于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{@Overridepublic 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;@Overridepublic void handlePrint() {adaptee.print();}
}

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

gitee源码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十八节 Java 多线程编程

Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语&…

信号值解读

dBm(分贝毫瓦)和RSRP(参考信号接收功率)都是用于表示无线信号强度的单位,但它们在概念上有所不同。 dBm:dBm是一种表示功率的单位,用于测量无线传输网络中信号的强度,它表示以毫瓦为…

代码随想录算法训练营day38

509. 斐波那契数 五部曲: dp数组下标及含义:dp[i]表示第i个斐波那契数的值dp数组初始化:dp[0]0,dp[1]1递推公式:dp[i] dp[i - 1] dp[i - 2]遍历方向:从前往后dp数组推到举例:0,1…

【错误分享】打开Qt编译生成的软件,“无法找到入口”

错误简介 这张图片显示的是一个计算机错误提示窗口,标题为“无法找到入口”。正文内容是:“无法定位程序输入点_Z21qRegisterResourceDataaiPKhS0_S0_于动态链接库Qt5Core.dll上。” 这意味着在尝试运行程序时遇到了问题。 具体来说,该错误表…

Vue内置组件Transition用法介绍

Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用它。 <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入&#xff0c;移动&a…

从大量数据到大数据,King’s SDMS仪器数据采集及科学数据管理系统的应用

对于实验室或检测机构&#xff0c;仪器设备是所有业务开展的基础&#xff0c;数据则是核心命脉&#xff0c;而传统的仪器设备原始数据收集方式&#xff0c;效率低耗时长、操作流程不规范、不易保存与查找、错误率高、易篡改等成了制约检测机构持续高速发展的瓶颈和弊端&#xf…

单例19c RMAN数据迁移方案

一、环境说明 源库 目标库 IP 192.168.37.200 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID beg beg hostname beg rman 数据量 1353M 说明:源库已经创建数据库实例&#xff0c;并且存在用户kk和他创建的表空间…

新规来了!智能音视频技术重塑信贷体验

近日&#xff0c;国家金融监督管理总局发布《固定资产贷款管理办法》《流动资金贷款管理办法》《个人贷款管理办法》&#xff08;以下简称“三个办法”&#xff09;。 具体来看&#xff0c;新规明确了以下要求&#xff1a; 1、明确视频面签、电子签约要求 允许商业银行通过视…

Oracle 19c RAC集群相关日志

1.DB日志&#xff08;数据库日志&#xff09; Redo Log&#xff08;重做日志&#xff09;&#xff1a; 在Oracle数据库中&#xff0c;重做日志记录了数据库发生的所有修改操作&#xff0c;包括数据的插入&#xff0c;更新和删除。在RAC的环境中&#xff0c;每个实例都有自己的重…

javascript专题一 ---- 使用不同的方法将小数转换为整数方法总结

在 JavaScript 中&#xff0c;我们经常需要将小数转换为整数。以下是我总结的一些常见的方法&#xff1a; 1、Math.floor(): 这个方法会向下取整&#xff0c;返回小于或等于给定数字的最大整数 var num 3.14; var integerNum Math.floor(num); // integerNum 将会是 3 2、…

Ubuntu22.04搭建CLion C++开发环境

Ubuntu22.04搭建CLion C开发环境 文章目录 Ubuntu22.04搭建CLion C开发环境1.首先下载CLion2.配置c环境3.创建快捷方式Reference 1.首先下载CLion 进入官网https://www.jetbrains.com/clion/download/#sectionlinux 然后进入自己存放这个压缩包的路径中&#xff0c; sudo mkd…

SQLite从出生到现在(发布历史记录)(二十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;从 SQLite 3.5.9 迁移到 3.6.0&#xff08;二十一&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 引言&#xff1a; SQLite拥有别人无法比拟的装机量&#xff0c;究竟什么成就了SQLite呢&#xff0c;本…

蓝桥杯每日一题:空调(差分)

Farmer John 的 N头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N个牛栏&#xff0c;编号为 1…N&#xff0c;每个牛栏里有一头牛。 第 i&#xfffd; 头奶牛希望她的牛栏中的温度是 pi&am…

在Visual Studio Code中编辑React项目时,以下是一些推荐的扩展

ESLint&#xff1a;这个扩展可以集成ESLint到VS Code中&#xff0c;帮助你在编写代码时发现和修复JavaScript和TypeScript的语法错误和代码风格问题。 Prettier - Code formatter&#xff1a;Prettier是一个代码格式化工具&#xff0c;可以自动格式化你的代码以保持一致的代码…

最长公共子序列、最长上升子序列(LCS与LIS)算法

最长公共子序列、最长上升子序列(LCS与LIS) 最长公共子序列(LCS) #include <bits/stdc.h> using namespace std; #define int long long const int N 1e39; int a[N],b[N],dp[N][N]; signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin>>…

大文件传输之为啥传输过程中出现宽带不足的情况

在当今数字化时代&#xff0c;大文件传输已成为企业日常运营的关键环节。然而&#xff0c;许多企业在传输大文件时经常面临宽带不足的问题&#xff0c;这不仅影响了工作效率&#xff0c;还可能导致业务机会的丧失。本文将探讨大文件传输过程中宽带不足的原因&#xff0c;以及镭…

【数据结构】稀疏矩阵的快速转置

【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09; 目录 【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09;三元表稀疏矩阵的转置方法一&#xff08;普通转置&#xff09;复杂度为O(T.muT.nu)方法二&#xff1a;快速转置 复杂度…

springboot的特点以及优缺点

什么是springboot Spring Boot是一个开源的Java框架,用于创建独立的、基于Spring的应用程序。它简化了Spring应用程序的配置和部署过程,并提供了自动配置的功能,让开发人员能够更专注于业务逻辑的实现,而不需要过多地关注配置问题。 Spring Boot内置了一些常见的第三方库和…

【2024年5月】如何高效寻找软考高级论文素材?

一、自己做过的项目 若自己有做过的项目&#xff0c;那就是最好的&#xff01;建议不要换其他的项目来写&#xff0c;优先选择自己的&#xff0c;毕竟熟悉&#xff0c;容易临场发挥&#xff0c;别人的项目没有参与过&#xff0c;无法深有体会。 二、各大期刊网站 包括中国知…

mysql使用datetime,java如何保存

CREATE TABLE user (省略部分代码create_time datetime NOT NULL COMMENT 创建时间省略部分代码)java class User {private Timestamp createTime; }java8 import java.sql.Timestamp;省略部分代码 LocalDateTime now LocalDateTime.now(); // 获取当前日期时间 Timestamp t…