代理模式:中间者的故事

代理模式:中间者的故事

介绍

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

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

需求分析

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

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

代理模式

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

第三种用途

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

第四种用途

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

总结

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

相关推荐
ydd10010016 天前
正则表达式匹配
正则表达式·代理模式
LayZhangStrive18 天前
设计模式(二)装饰器模式、代理模式(待更新)
设计模式·代理模式·装饰器模式·后端开发
Lam Tang23 天前
APS 系列文章10
java·代理模式
Lam Tang23 天前
APS 系列文章 08
java·代理模式
wangjialelele23 天前
动态规划DP经典题型总结(Java、C++):路径、子数组、子序列、背包问题详解
java·c++·算法·面试·动态规划·代理模式
聪明蛋子哟23 天前
从MCP到A2A再到Proxy:Agent-工具协议的三种代理模式
代理模式
Lam Tang23 天前
APS 系列文章 09
java·代理模式
Lam Tang24 天前
APS 系列文章 01
java·代理模式
只吃不吃香菜1 个月前
Windows 下基于 YAML 规则的指定域名分流:以哔哩哔哩为例
网络·网络协议·计算机网络·网络安全·代理模式
zhongjunyao1 个月前
Spec-Driven Development (SDD): The Definitive 2026 Guide
javascript·spring boot·python·eclipse·代理模式