Java设计模式中适配器模式是什么/适配器模式可以干什么/又如何实现

news2024/12/23 11:07:40

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

5.3 适配器模式

5.3.1 概述

  • 将一个类的接口转换为客户希望的另一种接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作
  • 分为类适配器模式和对象适配器模式,前者类之间耦合度高于后者且要求程序员了解现有组件库中的相关紫剑的内部结构,故应用少

5.3.2 结构

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

5.3.3 类适配器模式

读卡器案例,代码如下:

//适配者类接口
public interface TFcards {  
//    从TF卡读取数据  
    String readTF();  
//    往TF可写数据  
    void writeTF(String message);  
}
//适配者类
public class TFCardsImpl implements TFcards{  
    @Override  
    public String readTF() {  
        String message = "TFCards read message: Hello World!";  
        return message;  
    }  
    @Override  
    public void writeTF(String message) {  
        System.out.println("TFCards write message:" + message);  
    }  
}
//目标类接口
public interface SDCards {  
//    从SD卡读取数据  
    String readSD();  
//    往SD可写数据  
    void writeSD(String message);  
}
//目标类接口
public class SDCardsImpl implements SDCards{  
    @Override  
    public String readSD() {  
        String message = "SDCards read message: Hello World! SD!";  
        return message;  
    }  
    @Override  
    public void writeSD(String message) {  
        System.out.println("SDCards write message:" + message);  
    }  
}
//电脑使用类
public class Computer {  
    public  String readSD(SDCards sdCards)  
    {  
        if(sdCards == null)  
            throw new NullPointerException("SD card is not null");  
        return sdCards.readSD();  
    }  
}
//适配器类
public class SDAdaptorTF extends TFCardsImpl implements SDCards{  
    @Override  
    public String readSD() {  
        System.out.println("adaptor read tf card:");  
        return readTF();  
    }  
    @Override  
    public void writeSD(String message) {  
        System.out.println("adaptor write tf card:");  
        writeTF(message);  
    }
//测试类
  public static void main(String[] args) {  
        //创建计算机对象  
        Computer computer = new Computer();  
//        读取SD卡数据  
        String s = computer.readSD(new SDCardsImpl());  
        System.out.println(s);  
        System.out.println("========================");  
//        使用该电脑读取TF卡数据  
//        定义适配器类对象  
        SDAdaptorTF sdAdaptorTF  =new SDAdaptorTF();  
        String s1 = computer.readSD(sdAdaptorTF);  
        System.out.println(s1);  
    }
  • 结果如图![[Pasted image 20230103155109.png]]
  • 类图![[Pasted image 20230103155246.png]]
    注:
    类适配器模式违背了合成复用原则,仅在客户类有一个接口规范的情况下可用

5.2.4 对象适配器模式

  • 与类适配器模式案例一样,代码差不多,不同点
//适配器类
public class SDAdaptorTF implements SDCards {  
//    声明适配者类  
    private TFcards tFcards;  
    public SDAdaptorTF(TFcards tFcards)  
    {  
        this.tFcards = tFcards;  
    }  
    @Override  
    public String readSD() {  
        System.out.println("adaptor read tf card:");  
        return tFcards.readTF();  
    }  
    @Override  
    public void writeSD(String message) {  
        System.out.println("adaptor write tf card:");  
        tFcards.writeTF(message);  
    }  
}
//测试
    public static void main(String[] args) {  
        //创建计算机对象  
        Computer computer = new Computer();  
//        读取SD卡数据  
        String s = computer.readSD(new SDCardsImpl());  
        System.out.println(s);  
        System.out.println("========================");  
//        使用该电脑读取TF卡数据  
//        定义适配器类对象  
        SDAdaptorTF sdAdaptorTF  =new SDAdaptorTF(new TFCardsImpl());  
        String s1 = computer.readSD(sdAdaptorTF);  
        System.out.println(s1);  
    }
  • 结果![[Pasted image 20230103161010.png]]
  • 类图![[Pasted image 20230103161216.png]]
  • 注意
    还有一接口适配器模式,当不希望实现一个接口中所有方法时可以创建一个抽象类Adaptor,实现所有方法,此时只需要继承该抽象类即可

5.2.5 应用场景

  • 旧开发系统存在满足新系统功能需求类,但接口同新系统接口不一样
  • 使用第三方提供组件,但组件定义和自己要求接口定义不一样

5.2.6 JDK源码案例

Reader(字符流)、InputStream(字节流)的适配使用就是InputStreanReader
InputStremReader继承java.io包中的Reader,对其中抽象未实现方法给出实现,如下:

public int read() throws IOException {  
    return sd.read();  
}
public int read(char cbuf[], int offset, int length) throws IOException {  
    return sd.read(cbuf, offset, length);  
}

代码中的sd(StreamDecoder类对象),在Sun的JDK实现汇总,实际方法是对sun.nio.cs.StreamDecoder类同名方法的调用封装,类图如下:
![[Pasted image 20230103165330.png]]
上图可以看出:

  • InputStreamReader是对同样实现了Reader的StreamDecoder的封装
  • StreamDecoder不是Java SE API的内容,是Sun JDK的自身实现,是对构造方法中的字节流类(InputStream)进封账,并通过该类进行字节流和字符流之间解码转换
    结论:
    表层看,InputStreamReader做了InputStream字节流类到Reader字符流之间转换,从上图看,StreamDecoder的设计实际采用了适配器模式

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

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

相关文章

一套采用ASP.NET开发的工作通OA协同办公系统源码 流程审批 公文流转 文档管理

分享一套采用ASP.NET基于C#开发,使用桌面式的OA协同办公系统,超好用户体验效果的后台管理界面,集成 资讯、邮件、日程、文档(在线文件档案管理)、流程审批、公文流转、沟通与分享(在线聊天和内部论坛&#…

基于LLVM的C编译器--lcc——以CLion用SSH连接WSL Ubuntu22.04为例

Windows 10 22H2CLion 2022.3.1Ubuntu 20.04 (Microsoft Store内的WSL发行版) 一、下载WSL,换源,切换到WSL2 1.1 保证windows版本 在设置->系统->关于中查看 必须是win10及以上对于x64系统:版本1903或更高版…

ArcGIS基础实验操作100例--实验63由图片创建点符号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验63 由图片创建点符号 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

Java设计模式中代理模式是什么/JDK动态代理分为哪些,静态代理又怎么实现,又适合哪些场景

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 5.结构型模式 5.1 概述 根据如何将类或对象按某种布局组成更大的结构,分为类结构模式和对象结构模式,前者采用继承机制来组织接口和类&am…

视频序列对比学习

前言 视频embedding化也即表征有很多实际的应用场景,比如文本-视频 pair的检索等等。由于视频一般来说较长,所以对于给定的一段话,其中的某些sentence句子一般对应着视频中某几个clip片段,之前常规的做法都是去匹配所有的sentence…

人工服务、人工智能和分析是联络中心的主要趋势

数字联络中心提供商 IPI 宣布了其对 2023 年的预测。IPI 非常重视提供卓越的客户联系,认为未来一年将由以下趋势定义:专注于人工服务;增加对人工智能和自动化的采用;以及更多地使用数据和分析。 关注人性化服务 据 IPI 称&#…

实现QTreeView、QTableView子项中的复选框勾选/取消勾选功能

1.前言本博文所说的技术点适用于同时满足下面条件的所有视图类:模型类从 QAbstractItemModel派生。代理类从QStyledItemDelegate派生。故本博文所说的技术点也适用于QTableView。2.需求提出基于Qt的model/view framework技术,利用QTreeView树视图实现业务…

【异常】SpringSecurity登录失败:Full authentication is required to access this resource

一、报错提示 SpringSecurity提示如下内容: 2023-01-07 06:08:51.843 [cdi-ids-commonprovider] [http-nio-9092-exec-14] WARN com.desaysv.tsp.logic.ids.config.MyAuthenticationEntryPoint - 登录失败:Full authentication is required to acces…

基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现

基于JavaJspSpringMVC漫威手办商城系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

2023 年值得关注的 7 大人工智能 (AI) 技术趋势

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 人工智能 (AI) 已经接…

图数据库Neo4j实战(全网最详细教程)

1.图数据库Neo4j介绍 1.1 什么是图数据库(graph database) 随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数…

《Go 并发数据结构和算法实践》学习笔记 Day 1

极客时间21天打卡活动:2023.1.16-2.5 链表的接口: 插入元素删除元素读取元素 并发化改造: 并发插入元素并发删除元素并发读取元素 锁,每个节点都定义一把锁。 并发插入 区域猜想:如果某个CPU 锁定了某个节点&…

U3D客户端框架(资源管理篇)之资源热更新管理器 ResourceManager

一、资源热更新管理器模块设计 1.热更新是什么? 游戏或者软件内的 美术/脚本代码等资源 发生变化时,无需下载客户端重新进行安装,而是在应用程序启动的情况下,通过比对本地资源与CDN资源的MD5码,如果本地资源与CDN中…

Visual Code 打开方式添加到右键菜单

一、配置右键打开 文件 注册表找到分支: 计算机\HKEY_CLASSES_ROOT\*\shell 在这个里面 shell 分支里右键添加项 VisualCode(这个可以随便起,便于识别就行) 在 VisualCode 分支里右键添加项 Command(必须这个名&am…

【C++】双指针用法

快慢指针/同向指针 [0,i)的数据代表处理好的数据[i,j)的数据是那些处理过但不需要的数据[j,array.length)区间的数据为接下来待处理的数据。 以上三个区间的开和闭需要根据题目要求定义,但是要保持一致。 用此方法处理过的数组,处理好的数据相对位置会保…

(mysql)Waiting for table metadata lock

MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的。包括表结构、schema、存储过程、函数、触发器、mysql的调度事件(events). 要理解 metadata lock 最重要的一点就是&#xff1…

python连接mysql之PyMySQL的基本使用

一、PyMySQL的基本使用使用pymysql 直接连接mysqlPyMySQL安装pip3 install pymysqlimport pymysql# 连接数据库,创建连接对象connection # 连接对象作用是:连接数据库、发送数据库信息、处理回滚操作(查询中断时,数据库回到最初状…

关于Docker如何安装nginx

目录 1.Nginx 1.2. 安装nginx 2.容器之间相互通信 2.1.两个容器在同一网段 2.2.两个容器在不同网段 1.Nginx Nginx也是一款服务器,我们常用它做如:反向代理、负载均衡、动态与静态资源的分离的工作 反向代理:反向代理(Revers…

java spring下载步骤

首先 我们要下载一下 spring 我们访问spring的官网 地址非常的好记 spring.io project进入官网我们选择 project>Spring Framework 进入界面 我们选择 Learn 下面就会给我们列举出版本 这边建议大家下5.3.24 首先 要下GA的 因为这表示它比较稳定 其次 版本比较适中 大部分…

黑客动态播报 | 2023年网络攻击趋势

今天是跨入2023年大门的第一个工作日,作为开年的第一篇内容,我们从安全说起。      自2020年勒索软件攻击呈爆发式增长以来,全球企业都经历了“噩梦”般的三年,层出不穷的手段和无孔不入的方式,都让我们绷紧了每一条神经。      而在这三年里,我们并不是疲于应对,通过不…