设计模式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();

    @Override
    public 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可以直接运行。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformers实战02-BERT预训练模型微调

文章目录 简介BERT的基本原理分词模型输出 BERT预训练的方法BERT模型微调加载数据集DatasetDataLoader 训练模型构建模型tqdm使用训练模型模型预测 简介 BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer 模型的预…

Python爬取B站视频:封装一下

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️如遇文章付费,可先看…

深度学习500问——Chapter09:图像分割(5)

文章目录 9.12 DenseNet 9.13 图像分割的数据集 9.13.1 PASCAL VOC 9.13.2 MS COCO 9.13.3 Cityscapes 9.14 全景分割 9.12 DenseNet 这篇论文是CVPR2017年的最佳论文。 卷积神经网络结构的设计主要朝着两个方向发展,一个是更宽的网络(代表&#xff1a…

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索 文章目录 0论文工作1论文方法2 效果 0论文工作 文本到3D生成的最新进展标志着生成模型的一个重要里程碑,为在各种现实场景中创建富有想象力的3D资产打开了新的可能性。虽然最近在文本到3D生成方面的进展…

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例,抓取2010-2024年所有的微博数据excel,包含微博链接,微博内容,发布时间,点赞数,转发数,评论数,话题等。 每个月的微博转评赞总数曲线,2015年是高峰。 微…

Pod进阶——资源限制以及探针检查

目录 一、资源限制 1、资源限制定义: 2、资源限制request和limit资源约束 3、Pod和容器的资源请求和限制 4、官方文档示例 5、CPU资源单位 6、内存资源单位 7、资源限制实例 ①编写yaml资源配置清单 ②释放内存(node节点,以node01为…

APP广告变现怎么实现的,背后逻辑是什么?

广告变现的实现主要基于以下几个关键步骤和逻辑: 用户获取与留存:首先,APP需要吸引足够的用户并确保他们的留存率。只有拥有庞大且活跃的用户基础,APP才能吸引广告商投放广告。因此,开发者需要通过优化APP质量、提升用…

阅读笔记——《未知协议状态机推断技术研究综述》

【参考文献】盛嘉杰, 牛胜杰, 陈阳, 等. 未知协议状态机推断技术研究综述[J]. 计算机与现代化, 2023 (05): 58.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 摘要 协议逆向工程(PRE)描述了协议的行为逻辑&#xff…

【Python】—— lambda表达式

目录 (一)应用场景 (二)lambda 语法 (三)示例分析 (四)lambda参数形式 4.1 无参数 4.2 一个参数 4.3 默认参数 4.4 可变参数 :*args 4.5 可变参数 :…

需求响应+配网重构!含高比例新能源和用户需求响应的配电网重构程序代码!

前言 配电网重构作为配电网优化运行的手段之一,通过改变配电网的拓扑结构,以达到降低网损、改善电压分布、提升系统的可靠性与经济性等目的。近年来,随着全球能源消耗快速增长以及环境的日趋恶化,清洁能源飞速发展,分…

orin部署tensorrt、cuda、cudnn、pytorch

绝大部分参考https://blog.csdn.net/qq_41336087/article/details/129661850 非orin可以参考https://blog.csdn.net/JineD/article/details/131201121 报错显卡驱动安装535没法安装、原始是和l4t-cuda的部分文件冲突 Options marked [*] produce a lot of output - pipe it th…

基于SSM的“酒店管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“酒店管理系统”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 管理员登录页面 用户管理页面 客房信息查询 酒店详细信息 后台…

rmxprt转换的3D模型只有一半?---模大狮模型网

在3D建模和渲染的工作流程中,我们经常需要用到各种转换工具来兼容不同平台或软件之间的模型格式。rmxprt(或其他类似的模型转换工具)就是其中的一种,它能够将模型从一种格式转换为另一种格式。然而,有时在转换过程中可能会遇到一些问题&#…

工作中的冲突,职场人士应如何化解

在职场中,冲突和分歧是不可避免的现象。它们可能来源于工作分配不均、目标不一致、价值观差异或个性不合等。面对这些冲突和分歧,我们需要具备有效的冲突管理技巧来化解问题,以维持团队的和谐与工作效率。 分析冲突的原因至关重要。通常来说&…

StringMVC

目录 一,MVC定义 二,SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…

uniapp+canvas实现逐字手写效果

在移动端使用 UniApp 进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字,然后在特定时间后将这个字添加到 outputCanvas 上,形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 初始化 Canvas: 使用 uni.c…

每日一题《leetcode--1472.设计浏览器历史记录》

https://leetcode.cn/problems/design-browser-history/ 这里我是用双栈实现前进和后退。 #define URL_SIZE 21 #define STACK_SIZE 5000typedef struct {char *BackStack[STACK_SIZE]; //回退栈char *ForwardStack[STACK_SIZE]; //前进栈int BackTop; //回退栈的栈顶下标…

3D瓦片地图组件上线|提供DEM数据接入,全方位呈现三维地图地形!

在用户调研中,我们了解到很多用户自身的可视化项目,需要在垂直空间上表现一些业务,例如:3D地形效果,数据底板建设等,而传统的地图效果不满足此用户需求。瓦片地图能够无限加载大地图,以更三维的…

云端升级,智能适配——LDR6282,USB-C接口显示器的最佳选择

华为MateView USB-C接口显示器技术深度解析与科普 随着科技的飞速发展,终端显示产品也迎来了全新的变革。在众多更新迭代中,华为MateView显示器凭借其独特的USB-C接口设计,为用户带来了前所未有的便捷体验。本文将带您深入探索这款显示器的技…

uniapp开发vue3监听右滑返回操作,返回到指定页面

想要在uniapp框架中监听左滑或者右滑手势,需要使用touchstart和touchend两个api,因为没有原生的左右滑监听api,所以我们只能依靠这两个api来获取滑动开始时候的x坐标和滑动结束后的x坐标做比对,右滑的话,结束时候的x坐…