当前位置: 首页 > 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可以直接运行。

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

http://www.lryc.cn/news/351858.html

相关文章:

  • 一文了解基于ITIL的运维管理体系框架
  • Web前端开发技术-格式化文本 Web页面初步设计
  • Windows下部署Seata1.5.2,解决Seata无法启动问题
  • 我加入了C++交流社区
  • Vue从入门到实战Day11
  • day15|各种遍历的应用
  • 第12周作业--HLS入门
  • WorkManager使用技巧及各Android版本适配
  • 鼠标滚轮使用时上下跳动的解决方法
  • CSS【常用CSS样式、盒子模型、定位、浮动 、扩展样式】--学习JavaEE的day46
  • os.path 提供用于处理文件路径和文件的系统函数
  • golang通过go-aci适配神通数据库
  • 【Vue】Vue2中的Vuex
  • 前端生成二维码
  • wordpress woocommer 添加代码实现,点击按钮,将产品添加到购物车并且跳转到结账页面
  • Scala学习笔记6: 类
  • JS数组根据对象的某一个字段排序
  • JavaScript操作
  • 雪花算法 代码
  • 我把PostgreSQL最核心的插件撸干净了!!!
  • Transformer详解(1)-结构解读
  • 使用Flask Swagger自动生成API文档
  • 操作系统408考研-经典例题
  • 工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发
  • react中hook 函数的使用
  • 探索k8s集群中kubectl的陈述式资源管理
  • webgl入门-绘制三角形
  • 深入分析 Android Activity (三)
  • 电影《朝云暮雨》观后感
  • Isaac Sim仿真平台学习(1)认识Isaac Sim