关于适配器模式,我遗漏了什么
近期有些tasks需要 重构or适配 老的代码。
与其向上面堆💩,不如优雅的去解决。
首先我的问题在于,错误的把 堆屎的操作 ,当作了适配器模式的操作。
比如原函数入参,需要更改某个属性,把这种操作外包一层套进去,就是堆屎。
适配器模式的重点在于:适配器实现目标接口,并且持有适配者的实例
做法是:转换一个接口到另一个接口。(这个经常和外观模式搞混)
实际工作中尝试使用虚方法去实现,让前端的调用为被转换过的接口。
虚方法:
1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写
virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
但是我偏要用类适配器!
类适配器
类适配器:适配器继承适配对象,并实现适配目标的所有方法
public interface EuropeSocket {/** 欧式三叉 通电 接通电 插座*/String useEuropesocket();
}// 欧式三叉实现类
public class EuropeSocketImpl implements EuropeSocket {@Overridepublic String useEuropesocket() {String msg ="使用欧式三叉充电";return msg;}
}
public interface ChineseSocket {/*** 使用中国双叉充电* @return*/String useChineseSocket();
}// 中国插头的实现类
public class ChineseSocketImpl implements ChineseSocket {@Overridepublic String useChineseSocket() {String msg="使用中国双叉充电";return msg;}
}
/*** 定义适配器类 中国双叉转为欧洲三叉**/
public class ChineseAdapterEurope extends EuropeSocketImpl implements ChineseSocket {@Overridepublic String useChineseSocket() {System.out.println("使用转换器转换完成");return useEuropesocket();}
}
开始使用测试!
public class Computer {public String useChineseSocket(ChineseSocket chineseSocket) {if(chineseSocket == null) {throw new NullPointerException("sd card null");}return chineseSocket.useChineseSocket();}
}
提前注:父类声明子类实例化产生的对象使用的是子类从父类继承的方法和属性。
父类声明子类实例化对象详解_扶公瑾以苏的博客-CSDN博客_c父类对象由子类实例化
public class Client {public static void main(String[] args) {Computer computer = new Computer();ChineseSocket chineseSocket = new ChineseSocketImpl();System.out.println(computer.useChineseSocket(chineseSocket));System.out.println("------------");ChineseAdapterEurope adapter = new ChineseAdapterEurope();System.out.println(computer.useChineseSocket(adapter));/*** 输出:* 使用中国双叉充电* ------------* 使用转换器转换完成* 使用欧式三叉充电*/}
}
对象适配器
实现方式:对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。
题目还是和上面一样的哈。代码其实差异很小
目标(Target)接口:即图中的欧式三叉
public interface EuropeSocket {/** 欧式三叉 通电 接通电 插座*/String useEuropesocket();
}// 欧式三叉实现类
public class EuropeSocketImpl implements EuropeSocket {@Overridepublic String useEuropesocket() {String msg ="使用欧式三叉充电";return msg;}
}
复制代码
适配者(Adaptee):即中国双叉
public interface ChineseSocket {/*** 使用中国双叉充电* @return*/String useChineseSocket();
}// 中国插头的实现类
public class ChineseSocketImpl implements ChineseSocket {@Overridepublic String useChineseSocket() {String msg="使用中国双叉充电";return msg;}
}
复制代码
适配器(Adapter)类: 就是这个适配器内做了一些更改 从继承改为了成员变量的方式
public class ChineseAdapterEurope implements ChineseSocket {private EuropeSocket europeSocket;public ChineseAdapterEurope(EuropeSocket europeSocket) {this.europeSocket = europeSocket;}@Overridepublic String useChineseSocket() {System.out.println("使用转换器转换完成");return europeSocket.useEuropesocket();}
}
复制代码
电脑类
public class Computer {public String useChineseSocket(ChineseSocket chineseSocket) {if(chineseSocket == null) {throw new NullPointerException("sd card null");}return chineseSocket.useChineseSocket();}
}
复制代码
测试:
public class Client {public static void main(String[] args) {Computer computer = new Computer();ChineseSocket chineseSocket = new ChineseSocketImpl();System.out.println(computer.useChineseSocket(chineseSocket));System.out.println("------------");//这里做了更改EuropeSocket europeSocket=new EuropeSocketImpl();ChineseAdapterEurope adapter = new ChineseAdapterEurope(europeSocket);System.out.println(computer.useChineseSocket(adapter));/*** 输出:* 使用中国双叉充电* ------------* 使用转换器转换完成* 使用欧式三叉充电*/}
}
适合于解决问题常见:
- 需要的东西有,但不能用,且短时间无法改造。即,使得一个功能适合不同的环境。
- 在开发中,系统的数据、行为都匹配,但接口不符时,可以考虑适配器。
- 希望复用一些现存的类,但是接口又与复用环境的要求不一致,应该考虑用适配器模式。(使用一个已经存在的类,但它的接口(即,方法),与需要的不相同时)
2023/2/12
划重点:希望复用一些现存的类,但是接口又与复用环境的要求不一致,应该考虑用适配器模式。(使用一个已经存在的类,但它的接口(即,方法),与需要的不相同时)
这个正是我现在面临的问题。
总之,时间足够我就优雅的,完美的去建立一个可扩展性强的适配层。
如果催我。那我就堆堆乐 💩💩💩
references:
Java设计模式-适配器模式 理论代码相结合 - 掘金
相关文章:
关于适配器模式,我遗漏了什么
近期有些tasks需要 重构or适配 老的代码。 与其向上面堆💩,不如优雅的去解决。 首先我的问题在于,错误的把 堆屎的操作 ,当作了适配器模式的操作。 比如原函数入参,需要更改某个属性,把这种操作外包一层…...
SQL Serve 日志体系结构
SQL Server 事务日志记录着 undo 及 redo 日志,为了保证数据库在崩溃后恢复,或者在正常数据库操作期间进行回滚,保证数据库事务完整性和持久化。如果没有事务日志记录,数据库在事务上将不一致,并且在数据库崩溃后可能导…...
【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号,public,ooci
文章目录1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载3.引用:C中&取地址&#x…...
asio网络编程 tcp、udp、rpc
轻量级的tcp/udp/rpc库,简化socket程序编写。 同时,RPC部分也提供了方便易用的功能。 仓库地址 https://github.com/shuai132/asio_net asio_net a Tiny Async TCP/UDP/RPC library based on ASIO and RpcCore Features 简化TCP、UDP相关程序的编写…...
双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)
Depth2Uart 双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能:基于Intel Realsense官方提供的SDK,双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离࿰…...
jetson nano(ubuntu)安装Cmake
文章目录安装环境一.命令行安装二.Cmake源码编译安装安装环境 jetson nano 系统:4.6.1 一.命令行安装 sudo apt install cmake这种直接安装cmake的方式,其实安装的版本都太老了,这种方式不推荐 二.Cmake源码编译安装 更新一下系统软件 su…...
图的基本介绍和表示方式
图的基本介绍 为什么要有图这个基本数据结构? 我们还学习过线性表(数组、队列、链表和栈)和树,但是我们可以发现,线性表局限于一个直接前驱(就是只能有唯一一个前面的结点)和一个直接后继的(…...
本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED
本周大新闻,AR方面,消息称微软解散工业元宇宙团队;德国AR公司Gixel GmbH亮相;Brilliant推出单片式附加形态AR眼镜;MIT研发垂直堆叠全彩Micro LED;谷歌XR串流正式上线。VR方面,索尼发布了PS VR2的…...
SpringMVC:拦截器(12)
拦截器1. 拦截器概念2. 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1: 创建拦截器类步骤2: 配置拦截器类步骤3: SpringMVC添加SpringMvcSupport包扫描和interceptor包扫描步骤4: 简化SpringMvcSupport的编写5 测试3. 拦截器参数解析(了解)3.1 前置处理…...
计算机网络3:HTTP1.0和HTTP1.1的区别
目录1. HTTP是什么2.HTTP1.0和HTTP1.1的区别3.名词解释(1)If-Modified-Since(IMS)、Expires(2)If-None-Match,Etag(3)If-Unmodified-Since1. HTTP是什么 超文本传输协议…...
Urho3D 编辑器说明
Urho3D编辑器是一个脚本应用程序,可以与Urho3D播放器应用程序一起运行。要开始,请执行以下任意命令:(在bin目录中)Editor.bat、Editor.sh或Urho3DPlayer Scripts/Editor.as Urho3D播放器应用程序支持的所有命令行选项…...
C++类基础(十一)
运算符重载(二) ● 对称运算符通常定义为非成员函数以支持首个操作数的类型转换 struct Str {int val 0;Str(int input): val(input){}auto operator(Str x){std::cout << "auto operator(Str x)\n";return Str(val x.val);} }; int …...
Windows安装系列:SVN Server服务
一、下载与安装 1、下载VisualSVN-Server-5.1.1-x64.msi 地址:Download | VisualSVN Server 2、找到最新版本SVN 5.1.1,直接双击它,弹出如下安装界面 3、点击Next 4、勾选我接受, 点击"Next" 5、默认选项,…...
快速傅里叶算法(FFT)快在哪里?
目录 前言 1、DFT算法 2、FFT算法 2.1 分类 2.2 以基2 DIT(时间抽取) FFT 算法为例 2.2.1 一次分解 2.2.2 多次分解 参考 前言 对信号分析的过程中,为了能换一个角度观察问题,很多时候需要把时域信号波形变换到频域进行分…...
利用Markdown写学术论文资料汇总贴
1是最详细的,重点看! Markdown 写作,Pandoc 转换:我的纯文本学术写作流程 2补充一些细节,也可以看看。 用Markdown写作学术论文 3写得和上面差不多,如果上面两篇有什么问题还没解决,可以看看…...
MySQL 高级查询
目录1.左关联2.右关联3.子查询4.联合查询5.分组查询1.左关联 MySQL中的左关联(Left Join)是一种基于共同列的连接操作, 它将左侧表中的所有行与右侧表中匹配的行结合在一起, 如果右侧表中没有匹配的行,则结果集中右侧…...
JavaSE学习day4_01 循环for,while,do...while
1. 循环高级 1.1 无限循环 for、while、do...while都有无限循环的写法。 最为常用的是while格式的。 因为无限循环是不知道循环次数的,所以用while格式的 代码示例: while(true){} 1.2 跳转控制语句(掌握) 跳转控制语句&…...
C/C++中的static关键字
概述在C/C中都有static关键字的使用,可以分别修饰变量和函数,分为静态变量【静态成员】、静态成员函数。2. static用法概况静态变量的作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0ÿ…...
67 自注意力【动手学深度学习v2】
67 自注意力【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV19o4y1m7mo/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 给定长为n 的序列,每个xi为长为d的向量,自注意力将xi 既当…...
电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析
青少年软件编程(图形化)等级考试试卷(二级) 一、单选题(共25题,共50分) 1. 一个骰子,从3个不同角度看过去的点数如图所示,请问5的对面是什么点数?( ) …...
关于链表中插入结点的操作……
服了,好久没敲链表了,这都忘了 newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur-…...
【项目精选】百货中心供应链管理系统
点击下载源码 近年来,随着计算机技术的发展,以及信息化时代下企业对效率的需求,计算机技术与通信技术已经被越来越多地应用到各行各业中去。百货中心作为物流产业链中重要的一环,为了应对新兴消费方式的冲击,从供货到销…...
Qt优秀开源项目之十六:SQLite数据库管理系统—SQLiteStudio
首先,感谢CSDN官方认可 SQLiteStudio是一款开源、跨平台(Windows、Linux和MacOS)的SQLite数据库管理系统。 github地址:https://github.com/pawelsalawa/sqlitestudio 官网:https://sqlitestudio.pl/ 特性很多…...
Python __doc__属性:查看文档
在使用 dir() 函数和 __all__ 变量的基础上,虽然我们能知晓指定模块(或包)中所有可用的成员(变量、函数和类),比如:import string print(string.__all__)程序执行结果为:[ascii_lett…...
电子科技大学操作系统期末复习笔记(一):操作系统概述
目录 前言 操作系统概述 操作系统的目标与功能 操作系统的定义 目标 功能 操作系统的历史 单用户系统 简单批处理系统 多道批处理系统 分时系统 个人电脑 → 分布式系统 → 互联网时代 → 移动计算时代 → ...... 实时系统 操作系统的基本特征 并发 共享 虚拟…...
[实践篇]13.20 Qnx进程管理slm学习笔记(三)
【QNX Hypervisor 2.2用户手册】目录(完结) 4.2 模块 我们可以将组件组合成一个模块。模块中的进程可以组成一个子系统,也可以用于建立一组系统状态,例如基本操作和各种更高级别操作。注意,必须命名模块,以便可以在内部引用它们。而且每个模块必须描述成一个元素,形势如…...
冰冰学习笔记:多线程
欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…...
补充一些前端面试题
javascript有哪些库指路>js中的库uniapp和vue有什么区别什么是uniappuni-app(uni,读you ni,是统一的意思)是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web&#…...
七大设计原则之单一职责原则应用
目录1 单一职责原则介绍2 单一职责原则应用1 单一职责原则介绍 单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中…...
[USACO23JAN] Leaders B
题面翻译 题面描述 FJ 有 NNN 头奶牛,每一头奶牛的品种是根西岛 G 或荷斯坦 H 中的一种。 每一头奶牛都有一个名单,第 iii 头奶牛的名单上记录了从第 iii 头奶牛到第 EiE_iEi 头奶牛的所有奶牛。 每一种奶牛都有且仅有一位“领导者”,对…...
怎么做建设网站首页/html家乡网站设计
征途手机版主推国战系统,其中国家刺探是什么呢?国战相关的问题有哪些呢?今天当乐网小编给大家带来相关内容的解答:Q:《征途》共有几个国家?A:10个国家,分别是吴、赵、越、楚、燕、唐…...
淘宝客怎么做自己的网站/seo教程最新
九、SpEL SpEL是Spring表达式语言(Spring Expression Language)的简称,是一个支持运行查询和操作对象图的强大的表达式语言。 SpEL的语法类似EL,SpEL使用#{}作为界定符,所有在大括号内的字符都将被认为是SpEL。SpEL为bean的属性进行动态赋值提…...
在广告公司上班都干嘛/青岛自动seo
内存分配:1. 栈区:栈可分为Java虚拟机和本地方法栈2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更新一点年轻代可分为Ed…...
cnzz网站代做/下载百度网盘app最新版
文章目录一、C的const关键字二、const在类中的含义一、C的const关键字 这里可以分为两种情况: 一种是类似与C语言里面的 const char*,char* const; 一种是C用于类里面限定函数的。 const int* // const关键字 const int MAX_AGE 100; con…...
网站的建设原始代码/重庆网站建设外包
一、 ng-class ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类。 ng-class 指令的值可以是字符串,对象,或一个数组。 如果是字符串,多个类名使用空格分隔。如果是对象,需要使用 key-value 对,key 为你想要添…...
建设网站的公司排名/网络营销的特点有几个
往期精选● 深度解析某头条的一道面试题● 如果你还是“程序员”,我劝你别创业!● 【良心文章】终于有人把云计算、大数据和人工智能讲明白了!原文:https://blog.csdn.net/learningcoding/article/details/79983248作者:Yoda_wang搞懂 Hash…...