Proxy代理模式
1. 简介
定义
- 代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
意图
- 提供其他对象一个代理或占位符,来控制该对象的访问权限。
动机
- 通过控制来延迟对象的创建和实例化,直到真正需要使用该对象才进行创建和实例化。
- 由于一些对象创建和实例化需要占用大量系统资源,但我们并不能确定用户一定会调用该对象,所以通过延迟对象实例化来减缓系统资源的消耗。
- 通过控制来延迟对象的创建和实例化,直到真正需要使用该对象才进行创建和实例化。
经典实例
- EF中在Proxy代理模式下的对象都是代理对象,起到延迟加载导航属性的作用(访问时加载)
- Castle包中的动态代理
常见的代理模式设计
- 远程代理
- 为一个位于不同的地址空间的对象提供一个局域代表对象。
- 好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
- 虚拟代理
- 根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
- 代理可以对加载的过程加以必要的优化,达到节省资源的最用
- Copy-on-Write代理
- 虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。(StringBuilder、EF中的Entity代理)
- 智能引用(Smart Reference)代理
- 当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等
- 保护代理(Protect Proxy)
- 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
- 缓冲代理(Cache Proxy)
- 为某一个目标操作的结果提供临时的存储空间,以便多个程序调用可以共享这些结果,如:Abp中DbContext对象使用上的设计。
- 远程代理
类图
- 以智能引用代理为例
- 以智能引用代理为例
2. 示例
class Program
{
static void Main()
{
//这里方式可以更智能,比如使用IOC实例化,并实现动态代理
Subject obj=new Proxy();
obj.Request();
}
}
public abstract class Subject
{
public abstract void Request();
}
public class RealSubject : Subject
{
public override void Request()
{
//业务方法具体实现代码
}
}
public class Proxy : Subject
{
private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用
public void PreRequest()
{
//... ...
}
public override void Request()
{
PreRequest();
realSubject.Request(); //调用真实主题对象的方法
PostRequest();
}
public void PostRequest()
{
//... ...
}
}
如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者: 大师兄石头
来源: https://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!