代理模式:中间者的故事

news2025/1/21 4:56:24

代理模式:中间者的故事

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

介绍

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

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

需求分析

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

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

代理模式

先把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网页,为什么很快就能加载,仔细看一下实际上文字并不大主要是图片比较大,然而人家也不傻这里如果把大图放在主网页上岂不是需要加载很长时间,这时候就没一张缩略图其实就是一个代理,他存放了原始图片的大小和地址,当你点击的时候去实例化真实的对象。

第三种用途

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

第四种用途

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

总结

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

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

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

相关文章

同化的题解

时间限制: 1000ms 空间限制: 524288kB 题目描述 古人云:“近朱者赤近墨者黑”。这句话是很有道理的。这不鱼大大和一群苦命打工仔被安排进厂拧螺丝了。 进厂第一天,每个人拧螺丝的动力k都是不同且十分高涨的。但是当大家坐在一起后会聊天偷懒&#xf…

python3处理docx并flask显示

前言: 最近有需求处理docx文件,并讲内容显示到页面,对world进行在线的阅读,这样我这里就使用flaskDocument对docx文件进行处理并显示,下面直接上代码: Document处理: 首先下载Document的库文…

【论文解读】Learning based fast H.264 to H.265 transcoding

时间: 2015 年 级别: APSIPA 机构: 上海电力大学 摘要 新提出的视频编码标准HEVC (High Efficiency video coding)以其比H.264/AVC更好的编码效率,被工业界和学术界广泛接受和采用。在HEVC实现了约40%的编码效率提升的同时&…

源码补丁神器—patch-package

一、背景 vue项目中使用 vue-pdf 第三方插件预览pdf,书写业务代码完美运行,pdf文件内容正常预览无问题。后期需求有变,业务需求增加电子签章功能。这个时候pdf文件的内容可以显示出来,但是公司的电子签章无法显示。这令人沮丧&am…

B/S架构云端SaaS服务的医院云HIS系统源码,自主研发,支持电子病历4级

医院云HIS系统源码,自主研发,自主版权,电子病历病历4级 系统概述: 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统…

科研学习|论文解读——融合类目偏好和数据场聚类的协同过滤推荐算法研究

论文链接(中国知网): 融合类目偏好和数据场聚类的协同过滤推荐算法研究 - 中国知网 (cnki.net) 摘要:[目的/意义]基于近邻用户的协同过滤推荐作为推荐系统应用最广泛的算法之一,受数据稀疏和计算可扩展问题影响&#x…

大数据应用开发2-Scala语言各个环境配置

一、首先安装JDK1.8版本(简单过一下) 1.下载与安装 下载Java1.8 地址:Java Downloads | Oracle 中国 点击跳转(下载需要登录甲骨文账号) 下载完成运行 修改安装目录(两个都要改) 复制第一次修改的安装目录 2.配置环…

构建安全防线:SDLC中的供应链攻击防范最佳实践与Log360解决方案

在过去的12个月里,有10家公司发现了软件供应链风险。供应链中依赖关系的增加扩大了对手的攻击面。这也导致威胁行为者将注意力从仅影响最终用户的下游链转移到上游链,影响供应商、客户和最终用户。因此,让我们立即讨论如何使你的SOC团队在产品…

netty源码:(40)ReplayingDecoder

ReplayingDecoder是ByteToMessageDecoder的子类,我们继承这个类时,也要实现decode方法,示例如下: package cn.edu.tju;import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handle…

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录 之前发布过Window方式,这次结合以上主题,完善下Linux相关登入方式过程,纯属做个记录,有需要的朋友可以做个学习参考。 一、Windows环境提示“‘mysql’ 不是内部或外部命令,也不是可运行的程序或批…

超声波清洗机到底实不实用?哪些超声波清洗机值得入手

在日常生活中,我们常常会遇到各种难以清洗的物品,如眼镜、首饰、牙套等。传统的手工清洗方法不仅费时费力,而且难以彻底清除污渍。这时,超声波清洗机便进入了人们的视野。它利用超声波的振动来清除物品表面的污渍和杂质&#xff0…

观察者模式概述

观察者模式,它用于建立一种对象与对象之间的依赖关系, 一个对象发生改变将自动通知其他对象, 其他对象将相应做出反应。在观察者模式种,发生改变的对象称为观察目标, 而被通知的对象称为观察者,一个观察目标可以对应多…

【Spring实战】09 MyBatis Generator

文章目录 1. 依赖2. 配置文件3. 生成代码4. 详细介绍 generatorConfig.xml5. 代码详细总结 Spring MyBatis Generator 是 MyBatis 官方提供的一个强大的工具,它能够基于数据库表结构自动生成 MyBatis 持久层的代码,包括实体类、Mapper 接口和 XML 映射文…

C# 操作非持久化内存映射文件

目录 写在前面 代码实现 进程A 进程B 进程C 调用示例 总结 写在前面 多个进程之间,通过操作未映射到磁盘上现有文件的内存映射文件,可以实现数据共享和类似进程间通讯的功能。以下示例展示了使用三个独立进程,先各自将布尔值写入内存…

Vue axios Post请求 403 解决之道

前言: 刚开始请求的时候报 CORS 错误,通过前端项目配置后算是解决了,然后,又开始了新的报错 403 ERR_BAD_REQUEST。但是 GET 请求是正常的。 后端的 Controller 接口代码如下: PostMapping(value "/login2&qu…

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

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

Pytorch从零开始实战14

Pytorch从零开始实战——DenseNet SENet算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——DenseNet SENet算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook,使用Python3.8&#x…

排列组合算法(升级版)

前言 在上一期博客中我们分享了一般的排列组合算法(没看的话点这里哦~),但是缺点很明显,没法进行取模运算,而且计算的范围十分有限,而今天分享的排列组合升级版算法能够轻松解决这些问题,话不多…

Bean 生命周期 和 SpringMVC 执行过程

这里简单记录下 Bean 生命周期的过程,方便自己日后面试用。源码部分还没看懂,这里先贴上结论 源码 结论

PAT 乙级 1028 人口普查

解题思路:此题我想到俩种方法,一种是排序方法,一种是不排序的方法,首先都是看是否是有效年龄,然后一种是排序,另一种是维护最大值和最小值的变量,一定要注意如果有效数字是0那就只输出0就可以了…