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 里…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
