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

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

适配器模式(Adapter)

是一种行为型模式。

目录

一、概述

二、使用步骤

三、举例


一、概述

1、将一个类的接口转换成客户希望的另外一个接口;
2、使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
3、适配器模式主要用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

1.1、主要的角色分三种,但从代码(或技术)实现的角度看(为了充分使用面向对象语言的3大特性封装、继承、多态,还另外需要抽象类或接口)可能有4个:

  1. 客户原本需要的类,包括:客户原本需要的类的抽象类或接口(单个)+ 客户原本需要的类的实现类(多个)
  2. 需要适配的旧对象(数量没有明确限定)
  3. 适配器(数量没有明确限定)

  1.2、直观的理解上发起方使用需要适配的旧对象的流程如下:

 1.3、通过技术实现的角度看,对象之间关系的UML图如下:

二、使用步骤

  1. 先确定哪些对象不能被直接使用;
  2. 针对这些对象建立相应的适配器;
  3. 请求发起类直接在需要的时候直接调用适配器即可。

三、举例

简单举例,假设主程序需要一个普通请求,和一个特殊请求,其中主程序没有办法直接调用特殊请求。

对于本例,由于比较简单,可以不需要对普通请求对象进行抽象,我们在实践时也是一样,如果问题本身不是太复杂,也就不需要刻意花功夫去进行抽象,在其他模式种也一样。所以我们只需要加一个适配器即可。

3.1、设计之后,对象之间的关系用UML图表示如下:

3.2、Java实现代码如下(建议你在本地试一下,加深印象):

普通请求类:

public class Target {public void request() {System.out.println("普通请求!");}
}

特殊请求(被适配的对象):

public class Adaptee {public void specificRequest(){System.out.println("特殊请求!");}
}

适配器:

public class Adapter extends Target {private Adaptee adaptee = new Adaptee();@Overridepublic void request() {adaptee.specificRequest();}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {//普通请求Target target1 = new Target();target1.request();//适配后的请求Target target2 = new Adapter();target2.request();}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Prometheus+Grafana监控服务器、mysql数据库并配置报警规则推送邮箱
  • WORD、PPT技巧
  • Python文件和数据格式化-课堂练习[python123题库]
  • dmanywhere的docker制作
  • 【博客714】golang使用mmap来优化gc
  • 从零开始学Vue3--环境搭建
  • AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.9.3
  • 【FPGA】Verilog:解码器 | 编码器 | 多路复用器(Mux, Multiplexer)
  • 基于HTML5和CSS3搭建一个Web网页(二)
  • 本地部署Whisper实现语言转文字
  • 2024年【N1叉车司机】免费试题及N1叉车司机模拟试题
  • Spring服务启动后就执行某个方法
  • Alienware外星人笔记本m17 R3原厂OEM预装Win10系统包下载,恢复开箱状态电脑自带系统
  • python 多线程处理图片
  • 【算法】前缀和——寻找数组的中心下标
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java IO学习笔记一
  • mysql 数据库四种事务隔离级别
  • Vue2.x学习三:事件处理生命周期钩子
  • vue-router的history模式发布配置
  • 第十八天-企业应用架构模式-基本模式
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 构建工具 - 收藏集 - 掘金
  • 机器学习 vs. 深度学习
  • 讲清楚之javascript作用域
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 深度解析利用ES6进行Promise封装总结
  • 最简单的无缝轮播
  • zabbix3.2监控linux磁盘IO
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #HarmonyOS:Web组件的使用
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (强烈推荐)移动端音视频从零到上手(下)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • ./configure、make、make install 命令
  • .bat批处理(六):替换字符串中匹配的子串
  • .mysql secret在哪_MySQL如何使用索引
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core中的时区转换问题
  • .NET MVC 验证码
  • .net 验证控件和javaScript的冲突问题
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 的字符串暂存池
  • .Net7 环境安装配置
  • .NET实现之(自动更新)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件