当前位置: 首页 > news >正文

代理模式:中间者的故事

代理模式:中间者的故事

  • 介绍
  • 需求分析
  • 代理模式
  • 代码实现
  • 代理模式整理和用途
    • 第一种用途
    • 第二种用途
    • 第三种用途
    • 第四种用途
  • 总结

介绍

本文引用《大话设计模式》第七章节的内容进行学习分析,仅供学习使用

需求:小明拜托自己好朋友小王给他朋友小美送礼物。

需求分析

首先我们要知道这里我上文的需求小明和小美是互相不认识的,这里的小王却是两人的好朋友,所以这里就产生了小王这个中间人帮助小明给小美送花,那么我们在程序设计的时候其实小明和小美是不能直接建立关联的。

既然我分析中已经出来中间者了估计有很多人想到的设计模式是观察者设计模式和代理模式,因为我上面阐述的对于非代理来说只是一对一的关系,但是观察者设计模式不仅有一对一而且更是一对多,所以这里我们用代理模式介绍一下。

代理模式

先把UML图放在这里
在这里插入图片描述

这一篇代理模式来讲还是比较好理解的。实际上我们就可以把RealSubject这个类当作小明,我们把Proxy这个代理就当作小王,然而这个Subject就是一个抽象类去帮助小明和小王去实现共同方法送礼物,图中是没有小美的但是我们可以在Proxy这个代理中去创建一个小美的类,这样就完成了我上述说的通过小王,小明把礼物送给了小美,这就是一个代理模式。

代码实现

抽象类

using System;namespace Proxy{public abstract class SubjectNew{public abstract void SendObj(Present present);}}

小明实体类

using System;namespace Proxy{public class XiaoMing : SubjectNew{public override void SendObj(Present present){Console.WriteLine("送" + present.ToString());}}}

代理类

using System;namespace Proxy{public class ProxyNew : SubjectNew{XiaoMing m_xiaoming;public override void SendObj(Present present){if (m_xiaoming == null){m_xiaoming = new XiaoMing();}m_xiaoming.SendObj(present);}}}

礼物枚举类

using System;namespace Proxy{public enum Present{Flower,Milk,ToyBaby}}

最后看一下调用方式:

ProxyNew proxyNew = new ProxyNew();
proxyNew.SendObj(Present.Flower);
proxyNew.SendObj(Present.Milk);
proxyNew.SendObj(Present.ToyBaby);

这个就是上述的实现方式

代理模式整理和用途

这里我把上述代理模式的UML图源码放在下面

Subject抽象类

using System;namespace Proxy{public abstract class Subject{public abstract void Request();}}

RealSubject实体类

using System;namespace Proxy{public class RealSubject : Subject{public override void Request(){Console.WriteLine("这里是真实的请求");}}}

Proxy代理类

using System;namespace Proxy{public class Proxy : Subject{RealSubject realSubject;public override void Request(){if (realSubject == null) realSubject = new RealSubject();realSubject.Request();}}}

第一种用途

远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。也就是说当我们应用程序中引入一个Web引用,此时引用WebService是会生成一个WebReference的文件夹和一些文件,其实他就是代理,这就是的客户端要想远程连接的时候直接调用代理WebReference即可。

第二种用途

虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。比如说我们打开一个很大的HTML网页,为什么很快就能加载,仔细看一下实际上文字并不大主要是图片比较大,然而人家也不傻这里如果把大图放在主网页上岂不是需要加载很长时间,这时候就没一张缩略图其实就是一个代理,他存放了原始图片的大小和地址,当你点击的时候去实例化真实的对象。

第三种用途

安全代理,用来控制真实对象访问时的权限。

第四种用途

智能指引,是指在调用真实对象时,代理处理另外一些事,指责分开。

总结

个人认为代理模式还是在编程中比较常用的模式,希望本文章能够对读者有帮助。每天进步一点点。

相关文章:

代理模式:中间者的故事

代理模式:中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析,仅供学习使用 需求:小明拜托自己好朋友小王给他朋友小美…...

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 JVM进程缓存Lua语法入…...

是德科技E9304A功率传感器

是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率,功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径,设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…...

视频格式网络地址转换视频到本地,获取封面、时长,其他格式转换成mp4

使用ffmpeg软件转换网络视频,先从官网下载对应操作系统环境的包 注意:网络地址需要是视频格式结尾,例如.mp4,.flv 等 官网地址:Download FFmpeg window包: linux包: 如果下载缓慢,下载迅雷安装使用…...

企业私有云容器化架构运维实战

什么是虚拟化: 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM&#x…...

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C) Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步:保存相机当前参数设置UserSet_Save第二步:载入已经保存…...

STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 PHY寄存器 前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也…...

缓存和缓冲的区别

近期被这两个词汇困扰了,感觉有本质的区别,搜了一些资料,整理如下 计算机内部的几个部分图如下 缓存(cache) https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存(cache),就…...

C++高级-STL库概述

目录 一、概念 二、STL的历史背景 三、STL的版本 四、STL的主要优势...

uniapp 统一获取授权提示和48小时间隔授权

应用商店审核要求 获取权限前需要给提示,拒绝之后48小时不能给弹窗授权 项目用的是uniapp getImagePermission(v?: string, tag?: any, source?: any, proj?: any) {// proj proj || vueSelf.$proj(tag, source);let data {state: false,//是否原生授权denied…...

Halcon点云重建

dev_close_window () *点云文件数据的读取 read_object_model_3d (‘E:/1.om3’, ‘mm’, [], [], ObjectModel3D, Status) *获得点云的数据,例如高度 get_object_model_3d_params (ObjectModel3D, ‘point_coord_z’, GenParamValue) dev_open_window (0, 0, 512, …...

docker学习(二十一、network使用示例container、自定义)

文章目录 一、container应用示例1.需要共用同一个端口的服务,不适用container方式2.可用示例3.停掉共享源的容器,其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge,容器间ip通信默认bridge,容器间服务名不通 自…...

【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制(理论+源码)

这是Python机器学习原创文章,我的第183篇原创文章。 一、引言 对于表格数据,一套完整的机器学习建模流程如下: 背景知识1:机器学习中的学习器 【Python机器学习系列】一文搞懂机器学习中的转换器和估计器(附案例&…...

算法基础之整数划分

整数划分 核心思想: 计数类dp 背包做法 f[i][j] 表示 取 1 – i 的物品 总容量为j的选法数量 f[i][j] f[i-1][j] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i-1][j-kv[i]] f[i][j-v[i]] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i…...

关于“Python”的核心知识点整理大全47

目录 16.1.10 错误检查 highs_lows.py highs_lows.py 16.2 制作世界人口地图:JSON 格式 16.2.1 下载世界人口数据 16.2.2 提取相关的数据 population_data.json world_population.py 16.2.3 将字符串转换为数字值 world_population.py 2world_population…...

Android 8.1 设置USB传输文件模式(MTP)

项目需求,需要在电脑端adb发送通知手机端接收指令,将USB的仅充电模式更改成传输文件(MTP)模式,便捷用户在我的电脑里操作内存文件,下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…...

模型量化 | Pytorch的模型量化基础

官方网站:Quantization — PyTorch 2.1 documentation Practical Quantization in PyTorch | PyTorch 量化简介 量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作,精度降低,而不是 全精度&#xf…...

adb和logcat常用命令

adb的作用 adb构成 client端,在电脑上,负责发送adb命令daemon守护进程adbd,在手机上,负责接收和执行adb命令server端,在电脑上,负责管理client和daemon之间的通信 adb工作原理 client端将命令发送给ser…...

千巡翼X4轻型无人机 赋能智慧矿山

千巡翼X4轻型无人机 赋能智慧矿山 传统的矿山测绘需要大量测绘员通过采用手持RTK、全站仪对被测区域进行外业工作,再通过方格网法、三角网法、断面法等进行计算,需要耗费大量人力和时间。随着无人机航测技术的不断发展,利用无人机作业可以大…...

【Android 13】使用Android Studio调试系统应用之Settings移植(一):编译服务器的配置、AOSP源码的下载、编译、运行

文章目录 1. 篇头语2. 系列文章3. ubuntu 最佳版本3.1 下载并安装3.2 配置AOSP工具链3.3 配置Python多版本支持4. AOSP源码下载4.1 配置repo工具4.2 源码下载5. AOSP编译5.1 添加emulator模拟器配置5.1.1 哪些是支持模拟器的Products?5.1.2 添加方法5.2 编译...

汇编新手避坑指南:搞懂AX、BX、CX、DX这些“双面”寄存器,才算入门

汇编新手避坑指南:搞懂AX、BX、CX、DX这些“双面”寄存器,才算入门 第一次接触汇编语言时,那些神秘的寄存器名称总让人望而生畏。尤其是AX、BX、CX、DX这几个"双面人",一会儿能拆成AH和AL,一会儿又能合体使用…...

NY345固态MT29F32T08GWLBHD6-24T:B

NY345固态MT29F32T08GWLBHD6-24T:B在智能制造、交通控制、能源监测等关键领域,每一次写入与读取都决定着系统运行的可靠性。美光(Micron)MT29F32T08GWLBHD6-24T:B,以其32Tb大容量、工业级封装和多模式灵活切换,成为嵌入…...

C166编译器内联展开机制与嵌入式性能优化

1. C166编译器运行时库函数的内联展开机制解析在嵌入式开发领域,C166架构因其高效的实时性能被广泛应用于工业控制领域。作为长期使用Keil C166工具链的开发者,我发现编译器对标准库函数的内联优化处理直接影响着代码的执行效率和内存占用。本文将深入剖…...

从本地到云端:手把手教你用Talend Open Studio实现MySQL到AWS S3的数据同步

从本地到云端:手把手教你用Talend Open Studio实现MySQL到AWS S3的数据同步 在数字化转型浪潮中,企业数据正以惊人的速度从传统数据库向云端迁移。根据行业调研数据显示,85%的企业正在或计划将核心业务数据迁移至云平台,而其中数据…...

工业以太网IO模块级联技术:从Modbus TCP到MQTT的部署实践

1. 项目概述:为什么我们需要“可级联”的工业IO模块?在工业自动化现场摸爬滚打十几年,最头疼的事情之一就是布线。一个车间里,PLC、传感器、执行器、仪表星罗棋布,传统的IO模块要么通过现场总线(如Profibus…...

LinuxVLAN接口异常定位实战

LinuxVLAN接口异常定位实战这是一篇面向中级 Linux 使用者的技术文章,主题聚焦在VLAN接口,重点讨论链路隔离、子接口和二层网络划分。在真实生产环境中,VLAN接口相关问题往往不会以单一错误形式出现,而是混杂在日志、权限、资源状…...

LongWriter实战教程:从零开始构建你的专属写作AI

LongWriter实战教程:从零开始构建你的专属写作AI 【免费下载链接】LongWriter [ICLR 2025] LongWriter: Unleashing 10,000 Word Generation from Long Context LLMs 项目地址: https://gitcode.com/gh_mirrors/lo/LongWriter LongWriter是一款基于长上下文L…...

相位恢复技术:XY-Hamiltonian优化框架与应用

1. 相位恢复问题的本质与挑战相位恢复是衍射成像领域长期存在的核心难题。当光波通过物体时,其振幅和相位信息都会发生变化。然而,传统的光学探测器(如CCD)只能记录光强(振幅平方),而丢失了关键…...

【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解

【Java杂项】为什么 b 1 可以,但 b b 1 会报错?复合赋值与类型提升讲清楚前言一、先给结论:它不是简单的文本替换二、先看认知冲突2.1 普通赋值为什么报错2.2 复合赋值为什么能通过三、类型提升到底是什么3.1 常见类型提升结果3.2 为什么小…...

荣耀MagicOS 10系统游戏模式:如何启用幻影稳帧功能并调整游戏画面的流畅度与画质平衡?

用手机玩游戏,最怕遇到卡顿和画面不清晰。想开高帧率保证流畅,画质就可能下降;想开高画质享受视觉盛宴,又容易掉帧卡顿。这真是让不少玩家头疼的问题。如果你的荣耀手机升级到了MagicOS 10系统,那么恭喜你,…...