Proxy代理模式

>>返回《C#常用设计模式》

1. 简介

  • 定义

    • 代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
  • 意图

    • 提供其他对象一个代理或占位符,来控制该对象的访问权限。
  • 动机

    • 通过控制来延迟对象的创建和实例化,直到真正需要使用该对象才进行创建和实例化。
      • 由于一些对象创建和实例化需要占用大量系统资源,但我们并不能确定用户一定会调用该对象,所以通过延迟对象实例化来减缓系统资源的消耗。
  • 经典实例

    1. EF中在Proxy代理模式下的对象都是代理对象,起到延迟加载导航属性的作用(访问时加载)
    2. 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() 
    {
        //... ...
    }
}
posted @ 2021-02-16 15:18  大师兄石头  阅读(290)  评论(0编辑  收藏  举报