11 设计模式之代理模式(送资料案例)
一、什么是代理模式?
在现实生活中,我们常常遇到这样的场景:由于某些原因,我们可能无法亲自完成某个任务,便会委托他人代为执行。在设计模式中,代理模式 就是用来解决这种“委托”问题的,它允许一个对象通过代理对象来控制对另一个对象的访问。
今天我们就通过一个简单的例子来讲解代理模式的应用场景:小明委托小亮送资料给老师。
代理模式(Proxy Pattern)是一种结构型设计模式,它通过引入代理对象来控制对某个对象的访问。代理对象可以在访问实际对象之前或之后进行一些额外的操作。代理模式可以帮助我们在不改变原有对象的情况下,为对象提供附加功能。
1.代理模式的角色
- 主题接口(Object):存放任务的抽象接口
- 真实对象(Real Object):真正的执行任务的对象。
- 代理对象(Proxy):代理类,代替真实对象执行任务,并在必要时执行一些额外的操作。
- 委托者(Client):请求执行任务的对象,通常由客户端调用代理类来完成任务。
二、代理模式应用
假设小明有一份重要的资料需要交给老师,但由于某些原因,小明不能亲自送过去。于是,小明委托了小亮来代为送资料。
- 小明:需要将资料交给老师,无法亲自送达。
- 小亮:代理小明去送资料。
- 老师:实际接收资料的人。
在这个例子中,小明通过小亮来“代理”完成送资料的任务,而小亮在送资料之前可以做一些额外的操作(例如确认资料是否完整)。代理模式正是通过这种方式来实现任务的委托。
三、代理模式的类设计
我们将这个场景通过代码实现。下面是我们用 Java 语言实现的类设计。
1. 资料类 Document
资料类表示需要交给老师的资料,包含资料名称和内容。
public class Document {private String name; // 资料名称private String content; // 资料内容public Document(String name, String content) {this.name = name;this.content = content;}public String getName() {return name;}public String getContent() {return content;}@Overridepublic String toString() {return "资料名称: " + name + ", 内容: " + content;}
}
2. 送资料接口 Delivery
定义一个接口 Delivery
,所有的送资料类都需要实现这个接口。
public interface Delivery {void deliver(Document document); // 送资料的行为
}
3. 实际送资料的类 DeliveryService
DeliveryService
类实现了 Delivery
接口,并负责实际的送资料操作。
public class DeliveryService implements Delivery {@Overridepublic void deliver(Document document) {System.out.println("送资料给老师: " + document);}
}
4. 代理类 DeliveryProxy
DeliveryProxy
类作为代理,负责在送资料之前进行一些额外的操作,比如确认资料是否完好。如果资料没有问题,代理会将任务委托给 DeliveryService
。
public class DeliveryProxy implements Delivery {private DeliveryService deliveryService; // 代理类持有一个 `DeliveryService` 的引用public DeliveryProxy() {this.deliveryService = new DeliveryService(); // 实例化实际的送资料服务}@Overridepublic void deliver(Document document) {System.out.println("代理检查:确认资料是否完好...");// 代理类可以做一些额外的操作,比如验证资料if (document.getContent().length() > 0) {// 资料无误,代理继续执行送资料的任务System.out.println("代理:资料确认无误,开始送资料...");deliveryService.deliver(document); // 委托给实际送资料服务} else {System.out.println("代理:资料有问题,无法送达!");}}
}
5. 测试类 ProxyPatternTest
最后,我们编写一个测试类来验证代理模式的应用。
public class ProxyPatternTest {public static void main(String[] args) {// 模拟小明的资料Document document = new Document("Java 教学资料", "内容:Java设计模式");// 小明委托小亮送资料Delivery proxy = new DeliveryProxy();proxy.deliver(document);// 假设资料为空的情况Document brokenDocument = new Document("错误的资料", "");proxy.deliver(brokenDocument); // 代理会检查并拒绝送达}
}
四、代理模式的执行流程
在测试中,我们通过 ProxyPatternTest
类模拟了两次送资料的过程。
1.第一次送资料
- 代理类首先会检查资料是否完整。
- 如果资料没有问题,代理会将任务交给
DeliveryService
类来执行实际的送资料操作。
2.第二次送资料
- 代理类再次检查资料是否完整。如果资料为空,代理会直接拒绝送达。
3.执行输出:
代理检查:确认资料是否完好... 代理:资料确认无误,开始送资料... 送资料给老师: 资料名称: Java 教学资料, 内容: 内容:Java设计模式代理检查:确认资料是否完好... 代理:资料有问题,无法送达!
五、代理模式的优势与应用场景
1.代理模式的优势
- 增强功能:通过代理对象可以在不修改原始对象的情况下,增强其功能。
- 延迟加载:代理对象可以控制是否要真正加载或执行某些操作,节省资源。
- 灵活控制:代理对象可以控制真实对象的访问,进行权限管理或其他额外操作。
2.应用场景
- 延迟加载:例如图片、视频的加载,只有在需要时才加载资源。
- 虚拟代理:例如,显示大量数据时,只在用户滚动到相应位置时才加载数据。
- 远程代理:在分布式系统中,代理类可以作为客户端与远程服务之间的中介。
- 保护代理:代理类可以控制对真实对象的访问,例如权限控制、身份认证等。
六、总结
代理模式是一种结构型设计模式,它通过引入代理对象来控制对真实对象的访问。在我们的例子中,小明委托小亮送资料给老师,小亮作为代理类,在送资料之前可以做一些额外的操作,比如确认资料的完整性。通过代理模式,我们能够增强任务的功能而不修改实际执行任务的对象。
代理模式非常适合需要控制访问、增强功能或延迟加载的场景。如果你在项目中有类似需求,可以考虑使用代理模式。
希望这篇博客能够帮助你更好地理解代理模式的应用!如果有任何问题,欢迎随时在评论区留言或私信我。
相关文章:
11 设计模式之代理模式(送资料案例)
一、什么是代理模式? 在现实生活中,我们常常遇到这样的场景:由于某些原因,我们可能无法亲自完成某个任务,便会委托他人代为执行。在设计模式中,代理模式 就是用来解决这种“委托”问题的࿰…...

MongoDB聚合操作
1.聚合操作 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。 单一作用聚合:提供了对常见聚合过程的简单访问,…...
第二十三周周报:High-fidelity Person-centric Subject-to-Image Synthesis
目录 摘要 Abstract TDM SDM SNF 测试时的人物细节捕捉 主要贡献 总结 摘要 本周阅读了一篇2024年CVPR的关于高保真度、以人物为中心的图像合成方法的论文:High-fidelity Person-centric Subject-to-Image Synthesis。该论文提出了一种名为Face-diffuser的…...
Cesium 与 Leaflet:地理信息可视化技术比较
在现代地理信息系统(GIS)和空间数据可视化领域,Cesium 和 Leaflet 是两种非常常见的地理可视化库,它们各自适用于不同的应用场景。Cesium 专注于三维地球视图和复杂空间分析,而 Leaflet 则注重轻量级的二维地图展示。本文将对这两种技术进行详细的对比,帮助开发者根据具体…...

Linux 服务器使用指南:诞生与演进以及版本(一)
一、引言 在当今信息技术的浪潮中,Linux 操作系统无疑是一个关键的支柱😎。无论是在服务器管理、软件开发还是大数据处理领域,Linux 都以其卓越的适应性和优势脱颖而出👍。然而,对于许多新手而言,Linux 系统…...
龙蜥 Linux 安装 JDK
龙蜥 Linux 安装 JDK 下载安装解压到目标路径设置环境变量直接在启动脚本中临时设置 参考资料 下载 这个就不赘述了,参考资料中的另外两篇安装帖,都有。 如果不能上网,也可以去内网其他之前装过JDK的服务器,直接复制过来。 tar …...
Python小白语法基础20(模块与包)
0) 参考文章 python的模块(module)、包(package)及pip_python package-CSDN博客Python之函数、模块、包库_python函数、模块和包-CSDN博客Python函数模块自定义封装及模块嵌套导入(手把手教程)_python如何封装一个模块-CSDN博客 1) 模块与包说明 软件…...
详解 Qt QtPDF之QPdfPageNavigator 页面跳转
文章目录 前言头文件: 自 Qt 6.4 起继承自: 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析
目录 一、序列标注(Sequence Tagging)二、命名实体识别(Named Entity Recognition,NER)**命名实体识别的作用****命名实体识别的常见实体类别** : 三、标签类型四、序列标注的三种常见方法1. **BIO…...

【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现
代码主要实现了以下功能: 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode,包含节点数据值(字符类型)以及指向左右子树的指针。 定义了顺序栈结构体 SqStack,用于存储二叉树节点指针,实现非递归遍历…...

2024年11月文章一览
2024年11月编程人总共更新了21篇文章: 1.2024年10月文章一览 2.《使用Gin框架构建分布式应用》阅读笔记:p307-p392 3.《使用Gin框架构建分布式应用》阅读笔记:p393-p437 4.《使用Gin框架构建分布式应用》读后感 5.《Django 5 By Example…...

重生之我在异世界学编程之C语言:二维数组篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 二维数组的创建1. 二维数组的…...

和鲸科技创始人CEO范向伟出席首届工业智算产业发展研讨会,共话 AI 创新与产业化落地
11 月 22 日,首届工业智算产业发展研讨会在中国工业互联网研究院召开。工业和信息化部党组成员、副部长单忠德,国家信息中心大数据发展部副主任魏颖出席会议并致辞。中国工程院院士、北京化工大学教授高金吉,工业和信息化部信息通信发展司二级…...
postgres数据备份与主从配置
备份PostgreSQL数据库 备份格式有几种选择: bak:压缩二进制格式 sql:明文转储 tar: tarball mydb# \q -bash-4.2$ pg pgawk pg_dump pgrep pg_basebackup pg_dumpall pg_restore# 备份所有的 -bash-4.2$ pg_dumpall &…...

【二分查找】力扣 275. H 指数 II
一、题目 二、思路 h 指数是高引用引用次数,而 citations 数组中存储的就是不同论文被引用的次数,并且是按照升序排列的。也就是说 h 指数将整个 citations 数组分成了两部分,左半部分是不够引用 h 次 的论文,右半部分论文的引用…...
使用uni-app进行开发前准备
使用uni-app进行开发,需要遵循一定的步骤和流程。以下是一个详细的指南,帮助你开始使用uni-app进行开发: 一、开发环境搭建 安装Node.js: 首先,从Node.js的官方网站(https://nodejs.org/)下载并…...
AI开发-深度学习框架-PyTorch-torchnlp
1 需求 Welcome to Pytorch-NLP’s documentation! — PyTorch-NLP 0.5.0 documentation 2 接口 3 示例 4 参考资料...

VBA数据库解决方案第十七讲:Recordset对象记录位置的定位方法
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

Ubuntu 操作系统
一、简介 Ubuntu 是一个基于 Linux 的开源操作系统,它由 Canonical Ltd. 公司维护和资助。Ubuntu 以其易用性、强大的社区支持和定期的安全更新而闻名,一个一桌面应用为主的操作系统。 二、用户使用 1、常规用户的登陆方式 在登录时一般使用普通用户&…...
Maven 内置绑定到底怎么回事?
Maven是一个很好的项目管理工具. 一方面有着众多脚手架,另一方面在依赖管理方面 帮助使用者做了很多准备工作. 随着Maven的使用和学习的深入,大家会不仅有一些问题。 比较浅显的一个就是, 日常我们的Maven 下载安装好以后,在IDE 里…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...