代理模式:中间者的故事

代理模式:中间者的故事

介绍

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

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

需求分析

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

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

代理模式

先把UML图放在这里

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

代码实现

抽象类

csharp 复制代码
using System;
	namespace Proxy
	{
    	public abstract class SubjectNew
    	{
        	public abstract void SendObj(Present present);
    	}
	}

小明实体类

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

代理类

csharp 复制代码
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);
        	}
    	}
	}

礼物枚举类

csharp 复制代码
using System;
	namespace Proxy
	{
    	public enum Present
    	{
        	Flower,
       		Milk,
        	ToyBaby
    	}
	}

最后看一下调用方式:

csharp 复制代码
ProxyNew proxyNew = new ProxyNew();
proxyNew.SendObj(Present.Flower);
proxyNew.SendObj(Present.Milk);
proxyNew.SendObj(Present.ToyBaby);

这个就是上述的实现方式

代理模式整理和用途

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

Subject抽象类

csharp 复制代码
using System;
	namespace Proxy
	{
    	public abstract class Subject
    	{
        	public abstract void Request();
    	}
	}

RealSubject实体类

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

Proxy代理类

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

第三种用途

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

第四种用途

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

总结

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

相关推荐
运维儿8 小时前
7.ARP 代理与端口隔离:满足通信需求,保证通信安全
网络·智能路由器·代理模式·linux 网络·云计算网络
panzer_maus3 天前
工厂模式、代理模式与单例模式的介绍
java·设计模式·代理模式
花月C3 天前
线性动态规划(Linear DP)
算法·动态规划·代理模式
散峰而望4 天前
【基础算法】动态规划从入门到进阶:记忆化搜索、线性 DP、LIS/LCS 一网打尽
c++·后端·算法·github·深度优先·动态规划·代理模式
淡忘旧梦4 天前
ChatGPT回答白屏
人工智能·chatgpt·代理模式
会编程的土豆4 天前
【数据结构与算法】动态规划
数据结构·c++·算法·leetcode·代理模式
范纹杉想快点毕业6 天前
C语言编程实战宝典:550例精解·涵盖基础语法·数组指针·位运算·递归·贪心·动态规划
c语言·动态规划·代理模式
想不明白的过度思考者6 天前
SpringAOP:Java 三大代理模式:从静态代理到 JDK & CGLIB 动态代理
java·开发语言·代理模式
※DX3906※7 天前
SpringBoot之旅5| 快速上手SpringAOP、深入刨析动态/静态两种代理模式
java·数据库·spring boot·后端·spring·java-ee·代理模式
无籽西瓜a8 天前
【西瓜带你学设计模式 | 第九期 - 代理模式】代理模式 —— 静态与动态代理实现、优缺点与适用场景
java·后端·设计模式·软件工程·代理模式