代理模式:中间者的故事

发布时间:2023年12月28日

介绍

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

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

需求分析

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

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

代理模式

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

第三种用途

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

第四种用途

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

总结

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

文章来源:https://blog.csdn.net/qq_42194657/article/details/135238317
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。