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.代理模式的优势

  1. 增强功能:通过代理对象可以在不修改原始对象的情况下,增强其功能。
  2. 延迟加载:代理对象可以控制是否要真正加载或执行某些操作,节省资源。
  3. 灵活控制:代理对象可以控制真实对象的访问,进行权限管理或其他额外操作。

2.应用场景

  • 延迟加载:例如图片、视频的加载,只有在需要时才加载资源。
  • 虚拟代理:例如,显示大量数据时,只在用户滚动到相应位置时才加载数据。
  • 远程代理:在分布式系统中,代理类可以作为客户端与远程服务之间的中介。
  • 保护代理:代理类可以控制对真实对象的访问,例如权限控制、身份认证等。

六、总结

        代理模式是一种结构型设计模式,它通过引入代理对象来控制对真实对象的访问。在我们的例子中,小明委托小亮送资料给老师,小亮作为代理类,在送资料之前可以做一些额外的操作,比如确认资料的完整性。通过代理模式,我们能够增强任务的功能而不修改实际执行任务的对象。

        代理模式非常适合需要控制访问、增强功能或延迟加载的场景。如果你在项目中有类似需求,可以考虑使用代理模式。


        希望这篇博客能够帮助你更好地理解代理模式的应用!如果有任何问题,欢迎随时在评论区留言或私信我。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式系列】解释器模式(十七)

一、什么是解释器模式 解释器模式(Interpreter Pattern)是一种行为型设计模式,它的核心思想是分离实现与解释执行。它用于定义语言的文法规则,并解释执行语言中的表达式。这种模式通常是将每个表达式抽象成一个类,并通…

实时数据开发|Flink如何实现不同数据源输入--DataSource模块

DataStream 编程模型 Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分:DataSource模块,Transformation模块以及DataSink模块。 DataSource模块,主要定义了数据接入功能,将外部数据接入至flink&#xff0…

14、集合:

14、集合: 主要包括: 集合框架体系;Collection: List: ArrayList;LinkedList;Vector; Set: HashSet;LinkedHashSet;TreeSet。 Map:…

AI表情神同步!LivePortrait安装配置,一键包,使用教程

快手在AI视频这领域还真有点东西,视频生成工具“可灵”让大家玩得不亦乐乎。 现在又开源了一个超好玩的表情同步(表情控制)项目。 一看这图片,就充满了娱乐性。发布没几天就已经有8000Star。 项目****简介 LivePortrait 是一款…

OODA循环在网络安全运营平台建设中的应用

OODA循环最早用于信息战领域,在空对空武装冲突敌对双方互相较量时,看谁能更快更好地完成“观察—调整—决策—行动”的循环程序。 双方都从观察开始,观察自己、观察环境和敌人。基于观察,获取相关的外部信息,根据感知…

css使盒子在屏幕的地点固定

在 CSS 中&#xff0c;要将一个元素固定在页面的某个位置&#xff0c;可以使用 position: fixed 属性。以下是详细的代码示例和中文解释&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta n…

阿里云服务器(centos7.6)部署前后端分离项目

Mysql8安装部署 确定一下系统的glibc版本&#xff0c;可以使用以下命令进行查看&#xff0c;当前系统glibc版本&#xff1a;2.17&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; 要根据自己服务器的版本去选择对应的mysql&#xff0c;不然后续安装会报错&a…

Java中TimedCache缓存对象的详细使用

一、TimedCache 是什么&#xff1f; TimedCache是一个泛型类&#xff0c;它的主要作用通常是在一定时间范围内对特定键值对进行缓存&#xff0c;并且能够根据设定的时间策略来自动清理过期的缓存项。 TimedCache是一种带有时间控制功能的缓存数据结构。在 Java 中&#xff0c…

11、数组

1、数组概念 数组就是存储多个相同数据类型的数据。 比如&#xff1a;存储26个字母&#xff0c;存储一个班级的学生成绩。 2、数组使用 数组要遵循先定义再使用 2.1、数组定义的格式 存储数据---空间 ---- 数据类型 多少个 --- 数据个数 >> 数据类型 数…

六、文本搜索工具(grep)和正则表达式

一、grep工具的使用 1、概念 grep&#xff1a; 是 linux 系统中的一个强大的文本搜索工具&#xff0c;可以按照 正则表达式 搜索文本&#xff0c;并把匹配到的行打印出来&#xff08;匹配到的内容标红&#xff09;。 2、语法 grep [options]…… pattern [file]…… 工作方式…

【python】爬去二手车数据 未完成

技术方案 python selenium 先下载Microsoft Edge WebDriver Microsoft Edge WebDriver 官网 先看一下自己的edge版本 搜索到版本然后下载自己的版本 安装依赖 pip install seleniumimport time from selenium import webdriverdriver webdriver.Edge(executable_pathr&qu…

玩游戏常常出现vc++runtime library error R6025 这是什么意思,该怎么解决?

当玩游戏时常常出现“vc runtime library error R6025”错误&#xff0c;这通常表明微软C开发运行库组件存在问题。以下是对该错误及其解决方法的详细解释&#xff1a; 错误含义 “vc runtime library error R6025”是一个与Visual C运行时库相关的错误&#xff0c;该错误表明…

C++设计模式:桥接模式(Bridge)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一个用来解耦的设计模式&#xff0c;它将抽象层和实现层分离开&#xff0c;让它们可以独立变化。用最简单的话来说&#xff0c;就是让你能够改变抽象的功能和具体的实现&#xff0c;而不需要修改…

【深度学习基础】一篇入门模型评估指标(分类篇)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

深度学习基础02_损失函数BP算法(上)

目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

41 基于单片机的小车行走加温湿度检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接数码转换器模拟电量采集传感器&#xff0c; 电机采样L298N驱动&#xff0c;各项参数通过LCD1602显示&#x…

OkHttp3 - 2. OkHttp的核心组件与架构

1 OkHttp的工作原理 OkHttp3 的核心设计遵循以下原则&#xff1a; 请求与响应的分离&#xff1a;通过 Request 和 Response 对象解耦请求构建与结果处理。异步与同步支持&#xff1a;使用 Call 对象管理请求&#xff0c;可以同步或异步执行。高效连接复用&#xff1a;通过连接…

Python3 爬虫 Scrapy的使用

安装完成Scrapy以后&#xff0c;可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为&#xff1a; scrapy startproject <工程名> 例如&#xff0c;创建一个抓取百度的Scrapy项目&#xff0c;可以将命令写为&#xff1a; scrapy s…

好文推荐——sympy化简表达式高级处理——「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开

「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开 「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开_sympy解方程怎么格式化输出-CSDN博客