当前位置: 首页 > news >正文

java25种设计模式之适配器模式

1、定义

适配器模式在java中是一中结构型设计模式。
在实际的java来发中,有时候我们会遇到一些不能直接调用,或者不是客户需要的接口,但是却需要使用时,我们就可以使用适配器设计模式。
适配器设计模式就是将一个原本不兼容的接口通过转换或者适配成我们想要的接口,使原本两个不相关接口可以在一起工作。

2、角色分析

在改设计模式中,总共可以分为三个角色。
需要适配的类(Adaptee):需要适配的类或适配者类。
目标接口:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。(其实就是我们需要适配的接口)
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

3、实现方式

1).类适配器(采用继承实现)

2).对象适配器(采用对象组合方式实现)

4、类适配器

类适配器是通过继承类和实现接口来完成的,因此叫类适配器。
实例:
以type-c接口听歌为例。
假设我们有一部手机(type-c接口),一个耳机(圆孔),这时候我们需要一个中间的type-c 转换器才可以听歌,
1)首先我们有一部手机,可以播放音乐听歌,但是它不能直接出入耳机

// 需要适配的类:
public class Phone {public void playMusic() {System.out.println("播放音乐中");}
}

2)然后我们需要一个转换器,也就是type-c的转接口(也就是我们上面说的目标接口)

// 目标接口
public interface TypeC {/*** 处理转换器*/void handleTypeC();
}

3)再定义一个适配器继承手机,连接转换器。

/*** @Description: 适配器* @ClassName: Adapter* @Author: weisn* @Date: 2023/3/9 10:29* @Version: 1.0*/
public class Adapter extends Phone implements TypeC {/*** 处理转换器*/public void handleTypeC() {System.out.println("处理器转换中");// 可以听音乐了super.playMusic();}
}

4)东西都备齐了,但是还需要一个动作,那就是将转换器(type-c)插到手机上,当然,这一步就需要人去实现了。

public class Person {// 这个人准备用耳机听歌,他需要一个type-c转换器public void listenToMusic(TypeC typeC) {System.out.println("准备开始听音乐");typeC.handleTypeC();}public static void main(String[] args) {// 人想听歌,需要一个适配器Person person = new Person();Adapter adapter = new Adapter();// 实现听歌person.listenToMusic(adapter);}}

运行结果
运行结果

5、对象适配器

对象适配不是使用多继承或者继承实现接口的方式实现,而是使用直接关联引用的方式。
1) 更改适配器代码如下:

public class Adapter1 implements TypeC {private Phone phone;// 构造方式初始化具体的类public Adapter1(Phone phone) {this.phone = phone;}/*** 处理转换器*/public void handleTypeC() {System.out.println("处理器转换中");// 可以听音乐了phone.playMusic();}
}

2)具体实现和使用

public class Person {// 这个人准备用耳机听歌,他需要一个type-c转换器public void listenToMusic(TypeC typeC) {System.out.println("准备开始听音乐");typeC.handleTypeC();}public static void main(String[] args) {
//        // 人想听歌,需要一个适配器
//        Person person = new Person();
//        Adapter adapter = new Adapter();
//        // 实现听歌
//        person.listenToMusic(adapter);Person person = new Person();Phone phone = new Phone();Adapter1 adapter = new Adapter1(phone);person.listenToMusic(adapter);}}

总结

推荐使用对象适配器。
因为类适配器是通过继承对象和接口来完成,java不支持具体类的多继承,所以一个适配器只能继承一个具体类或者抽象类。
而类适配器是通过直接关联对象的方式完成的,一个适配器可以关联多个具体对象。

相关文章:

java25种设计模式之适配器模式

1、定义 适配器模式在java中是一中结构型设计模式。 在实际的java来发中,有时候我们会遇到一些不能直接调用,或者不是客户需要的接口,但是却需要使用时,我们就可以使用适配器设计模式。 适配器设计模式就是将一个原本不兼容的接口…...

【微服务】—— 初识微服务

文章目录1. 什么是微服务1.1 微服务的特性自主专用性1.2 微服务的优势敏捷性灵活扩展轻松部署技术自由可重复使用的代码弹性2. 微服务技术栈3. 微服务架构演进3.1 单体架构3.2 分布式架构服务治理3.3 微服务微服务结构微服务技术对比企业需求1. 什么是微服务 微服务是一种开发软…...

Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

C#服务端用到Fleck包,它包含哪些可用的回调函数,有哪些常用的api方法? 演示:服务端收到Unity用户发来的信息 1、Fleck服务器提供哪些回调函数 Fleck提供的回调函数有下面几种: //用户连入服务器时... Action OnOp…...

【Linux】线程概念 | 线程控制

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉知识补充&…...

pocsuite3安装及使用

pocsuite3安装及使用简介项目地址环境配置及安装环境要求安装(详情可以参考[https://pocsuite.org/](https://pocsuite.org/))使用方法运行模块加载目标参数:Console模式查看有哪些模块使用Telnet 弱密码模块这里以flask模板注入漏洞为例pocs…...

docker从安装到部署一个项目

一.centos安装docker 参考博客:https://blog.csdn.net/m0_47010003/article/details/127775185 1.设置一下下载Docker的镜像源 设置下载的镜像源为国内的阿里云,如果不设置,会默认去Docker的官方下载 yum-config-manager --add-repo http…...

QT编程从入门到精通之十二:“第四章:Qt程序创建基础”之“4.1 创建基础程序”

目录 第四章:Qt程序创建基础 4.1 创建基础程序 4.1.1 新建一个项目...

黑客入门教程【非常详细】从零基础入门到精通,看这一篇就够了!

首先要明白啊,我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客,说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心就是渗透攻防技术,是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模拟恶意…...

手机怎么远程控制腾讯云云服务器?

手机怎么远程控制腾讯云云服务器?腾讯云提供的连接:Windows系统。可以用远程桌面连接,你本地电脑点击,开始-运行-输入mstsc,弹出的框里,填IP和账号密码信息。 管理服务器上还会运行一个数据采集程序&#…...

dorcker与vlu靶场搭建

dorcker与vlu靶场搭建 dorcker安装 以kali linux 为例 安装必要的一些系统工具 apt update apt -y install apt-transport-https ca-certificates curl software-properties-common 添加Docker PGP key curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg …...

Unity性能优化 - Overdraw篇

一、什么是Overdraw Unity Overdraw(超绘)是指在渲染过程中绘制了超过一次相同像素的现象。当多个UI元素重叠时,每个像素都需要被多次绘制。这种绘制超出了渲染所需的最小像素数,因此被称为Overdraw。 二、都有哪些元素会导致Ov…...

Tp5操作mysql json函数

Tp5操作mysql json函数 官方文档介绍正常单个json数据更新没什么问题,但是某些情况可能一次修改多个,但是也不想全部替换 怎么处理?注意 :在源码中 项目\thinkphp\library\think\db\builder.php@parseData方法中 修改控制器调用:官方文档介绍 JSON字段 从V5.1.4+版本开始…...

【蓝桥杯嵌入式】PWM的设置,原理图解析与代码实现(第十一届省赛为例)——STM32

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...

Learning C++ No.13【STL No.3】

引言: 北京时间:2023/3/7/15:33,还有27分钟就要去上课啦!刚刚把最近因为考试原因欠的课给还干净了,已经准备好今天晚上接受航哥的毒打了,毒打就毒打,咱不怕,只要不欠钱,…...

推荐收藏!10大程序员必备生产力工具

作为程序员,提高生产力是我们一直追求的目标。随着技术的发展,越来越多的工具和应用程序被开发出来,帮助程序员们更好地完成工作。在本文中,我将介绍一些程序员必备的生产力工具。 一、IDE(集成开发环境) …...

【项目总结】基于SSM+SpringBoot+Redis的个人博客系统项目总结

文章目录项目介绍(开发背景)数据库设计主要使用到的技术点前端后端自定义统一返回对象自定义拦截器加盐加密操作分页功能session持久化自定义头像的存储和获取项目编写过程中遇到的困难点困难点一(小)困难点二(小&…...

从入门到精通MongoDB数据库系列之一:MongoDB简介

从入门到精通MongoDB数据库系列之一:MongoDB简介 一、易于使用二、易于扩展三、功能丰富四、性能卓越五、设计理念MongoDB是功能强大、灵活且易于扩展的通用型数据库。融合了二级索引、范围查询、排序、聚合以及地理空间索引等诸多特性。 一、易于使用 MongoDB是面向文档的数…...

大数据系列——什么是hdfs?hdfs用来干什么的?

一、什么是HDFSHDFS全称是Hadoop Distributed File System是一种分布式文件系统(HDFS使用多台计算机存储文件,对外提供统一操作文件的接口)Hodoop使用HDFS(Hadoop Distributed File System)作为存储系统。二、hdfs用来干什么的用于大规模数据的分布式读写&#xff0…...

云端地球2月更新了这些功能,你都用过了吗?

时光飞逝、转眼已到2023年的第三个月,武汉的天气也逐渐转好,温度步步高升。云端地球产研团队的脚步也越走越快,虽然春节仿佛还是昨天的事,但云端地球已经完成了四次迭代,为广大建模爱好者带来了更多实用功能&#xff0…...

基于gin-vue-admin[gin+gorm]手动实现crud(全)

使用Gin-Vue- Admin框架手动实现crud 在gva框架下自己手动实现一个CRUD的操作,该操作将会结合gen进行探讨学习,具体实现可以看下面代码的实现,项目目录层级分为api层,service层,model层,common层&#xff…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...