【结构性型模式-适配器模式】

定义

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

结构

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
【例】读卡器:
现有一台电脑只能读取SD卡,而要读取TE卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将E卡中的内容读取出来。类图如下:
在这里插入图片描述

package com.syn.adapter.class_adapter;/*目标接口*/
public interface SDCard {/*从SD中读数据*/String readSD();/*从SD中写数据*/void writerSD(String msg);
}
package com.syn.adapter.class_adapter;public class SDCardImpl implements SDCard{@Overridepublic String readSD() {String msg = "SDCard read msg: test_SD";return msg;}@Overridepublic void writerSD(String msg) {System.out.println("SDCard write msg:" + msg);}
}
package com.syn.adapter.class_adapter;public interface TFCard {/*从TF中读数据*/String readTF();/*从TF中写数据*/void writerTF(String msg);
}
package com.syn.adapter.class_adapter;/*适配者类*/
public class TFCardImpl implements TFCard{@Overridepublic String readTF() {String msg = "TFCard read msg: test_TF";return msg;}@Overridepublic void writerTF(String msg) {System.out.println("TFCard write msg:" + msg);}
}
package com.syn.adapter.class_adapter;/*计算机类*/
public class Computer {/*从SD卡读取数据*/public String readsD(SDCard sdcard){if(sdcard == null)new NullPointerException("sd card is not null");return sdcard.readSD();}
}
package com.syn.adapter.class_adapter;/*适配器类*/
public class SDAdapterTF extends TFCardImpl implements SDCard{@Overridepublic String readSD() {System.out.println("adapter read tf card.");return readTF();}@Overridepublic void writerSD(String msg) {System.out.println("adapter writer tf card.");writerTF(msg);}
}
package com.syn.adapter.class_adapter;public class Client {public static void main(String[] args) {/*创建计算机对象*/Computer computer = new Computer();/*读取SD卡中的数据*/String msg = computer.readsD(new SDCardImpl());System.out.println(msg);System.out.println("=================");/*使用该电脑读取TF卡中的数据*//*定义适配器类*/String msg1 = computer.readsD(new SDAdapterTF());System.out.println(msg1);}
}

在这里插入图片描述
类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

对象适配器模式

实现方式:对象适配器模式可采用将现有组件库中已经实现的组件引入适配器类中工该类同时实现当前系统的业务接口。
【例】读卡器:
我们使用对象适配器模式将读卡器的案例进行改写。类图如下:
在这里插入图片描述
代码中更改适配器类与客户端:

package com.syn.adapter.object_adapter;/*适配器类*/
public class SDAdapterTF implements SDCard {/*声明适配者类*/private TFCard tfCard;public SDAdapterTF(TFCard tfCard){this.tfCard = tfCard;}@Overridepublic String readSD() {System.out.println("adapter read tf card.");return tfCard.readTF();}@Overridepublic void writerSD(String msg) {System.out.println("adapter writer tf card.");tfCard.writerTF(msg);}
}
package com.syn.adapter.object_adapter;public class Client {public static void main(String[] args) {/*创建计算机对象*/Computer computer = new Computer();/*读取SD卡中的数据*/String msg = computer.readsD(new SDCardImpl());System.out.println(msg);System.out.println("=================");/*使用该电脑读取TF卡中的数据*//*定义适配器类*/String msg1 = computer.readsD(new SDAdapterTF(new TFCardImpl()));System.out.println(msg1);}
}

注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方
法。而此时我们只需要继承该抽象类即可。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

TAGE predictor

参考文档:分支预测算法(一):TAGE|SunnyChen的小窝 TAGE的基础概念 TAGE是现今最经典的分支预测算法,TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此,要聊分支预测算法的话题必定绕不开…

C语言编程4:复合赋值,递增递减运算符,局部变量与全局变量,本地变量,转义字符

一篇文章带你玩转C语言基础语法4:复合赋值,递增递减运算符,局部变量与全局变量,本地变量,转义字符 一、复合赋值🌿 1.1💠定义 赋值就是给任意一个变量或者常量赋一个值,这个值可以…

0基础学会在亚马逊云科技AWS上搭建生成式AI云原生Serverless问答QA机器人(含代码和步骤)

小李哥今天带大家继续学习在国际主流云计算平台亚马逊云科技AWS上开发生成式AI软件应用方案。上一篇文章我们为大家介绍了,如何在亚马逊云科技上利用Amazon SageMaker搭建、部署和测试开源模型Llama 7B。下面我将会带大家探索如何搭建高扩展性、高可用的完全托管云原…

在亚马逊云科技AWS上利用SageMaker机器学习模型平台搭建生成式AI应用(附Llama大模型部署和测试代码)

项目简介: 接下来,小李哥将会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。本次介绍的是如何在Amazon …

VBA实现Excel的数据透视表

前言 本节会介绍通过VBA的PivotCaches.Create方法实现Excel创建新的数据透视表、修改原有的数据透视表的数据源以及刷新数据透视表内容。 本节测试内容以下表信息为例 1、创建数据透视表 语法:PivotCaches.Create(SourceType, [SourceData], [Version]) 说明&am…

C语言程序题(一)

一.三个整数从大到小输出 首先做这个题目需要知道理清排序的思路,通过比较三个整数的值,使之从大到小输出。解这道题有很多方法我就总结了两种方法:一是通过中间变量比较和交换,二是可以用冒泡排序法(虽然三个数字排序…

【重大消息】报告称OpenAI的产品可经由微软的服务提供给中国客户

尽管OpenAI正在采取措施限制中国用户访问其平台,但一份最新报告称,中国用户仍可通过微软的Azure云计算平台访问该公司的产品。微软和OpenAI有着密切的合作关系,前者通过人工智能功能获得了独家产品访问权以拓展企业计算。最新的报道来自《The…

秋招突击——7/9——复习{Java实现——LRU,Java实现——搜索插入位置}——新作{二分查找——搜索二维矩阵}

文章目录 引言复习Java实现——LRU缓存对照实现 Java实现——搜索插入位置java实现知识补充 新作搜索二维矩阵个人实现参考实现 总结 引言 以后都要向使用Java刷算法进行过滤了,所以今天主要是复习为主,复习两道之前做过的题目,然后做两道新…

STM32智能交通灯控制系统教程

目录 引言环境准备智能交通灯控制系统基础代码实现:实现智能交通灯控制系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:交通灯管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯控…

迅狐抖音机构号授权矩阵系统源码

在数字化营销的浪潮中,抖音以其独特的短视频形式迅速崛起,成为品牌传播和用户互动的重要平台。迅狐抖音机构号授权矩阵系统源码作为一项创新技术,为品牌在抖音上的深度运营提供了强大支持。 迅狐抖音机构号授权矩阵系统源码简介 迅狐抖音机…

Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比

章节内容 上一节完成了如下的内容: 编写Agent Conf配置文件收集Hive数据汇聚到HDFS中测试效果 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0…

【动态规划Ⅵ】背包问题 /// 组合问题

背包问题 什么是背包问题0-1背包问题分数背包完全背包问题重复背包问题 背包问题例题416. 分割等和子集474. 一和零 完全平方数279. 完全平方数322. 零钱兑换 排列与组合组合,无重复:518. 零钱兑换 II排列,可重复:377. 组合总和 Ⅳ…

【效率提升】多功能组织和整理软件一Notion

Notion下载地址:https://www.notion.so/desktop Notion 是一款多功能办公软件,非常适合进行知识整理、团队协作、项目整理等。 下面是几个我推荐Notion的关键点: 一、排版高度自由:Notion的页面可以嵌套,在页面中还支…

Games101——光珊化——深度缓存——shading着色 1

深度缓存 如何解决远近的问题,能正确的覆盖 按照画作来说,先画出远处的物体,再画出近处的物体,近处会将其覆盖,这种算法叫做画家算法 但事实上,排序不仅要花更多的时间,而且排序并不容易&…

apache:the requested operation has failed使用httpd -t

Apache24\bin cmd 回车 httpd -t 因为我重新压缩了,记住,重新压缩要使用原路径, 因为你安装的 时候使用的是原路径 还是不行就改个端口,切记修改配置文件httpd.conf先把Tomcat停了 Define SRVROOT "F:\Apache\Apache24&q…

“Numpy数据分析与挖掘:高效学习重点技能“

目录 # 开篇 # 补充 zeros & ones eye 1. numpy数组的创建 1.1 array 1.2 range 1.3 arange 1.4 常见的数据类型 1.5 astype 1.6 random.random() & round 2. numpy数组计算和数组计算 2.1 reshape 2.2 shape 2.3 将一维数组变成多维数组 2.4 指定一维…

生产者消费者模型和线程同步问题

文章目录 线程同步概念生产者消费者模型条件变量使用条件变量唤醒条件变量 阻塞队列 线程同步概念 互斥能保证安全,但是仅有安全不够,同步可以更高效的使用资源 生产者消费者模型 下面就基于生产者消费者来深入线程同步等概念: 如何理解生产消费者模型: 以函数调用为例: 两…

14-58 剑和诗人32 - 使用矢量数据库增强 LLM 应用程序

GPT-4、Bloom、LaMDA 等大型语言模型 (LLM) 在生成类似人类的文本方面表现出了令人印象深刻的能力。然而,它们在事实准确性和推理能力等方面仍然面临限制。这是因为,虽然它们的基础是从大量文本数据中提取统计模式,但它们缺乏结构化的知识源来为其输出提供依据。 最近,我们…

红日靶场----(三)漏洞利用

上期已经信息收集阶段已经完成,接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/(数据库的管理界面) root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

(自用)gtest单元测试

gtest是Google的一套用于编写C测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报…