代理(Proxy)模式

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的反问。

* 抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。
* 代理主题(Proxy)角色:代理主题角色内部含有对真是主题的引用,从而可以在任何时候操作真实主题对象;
  代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;
  控制真实主题的应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);
  代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。
* 真实主题角色(RealSubject)角色:定义了代理角色所代表的真实对象。

 如下代码 通过代理类 Proxy  来实现,真实主题角色(RealSubject)中的 Request() 方法。

没有直接 实例化 RealSubject 类 来实现。

      static void Main(string[] args)
        {
            // 创建代理和请求一个服务
            Proxy p = new Proxy();
            p.Request(); 
            Console.ReadLine();
        }

    /// <summary>
    /// 抽象主题角色(Subject)
    /// </summary>
    public abstract class Subject
    {
        // 函数
        public abstract void Request();
    }
    /// <summary>
    /// 真实主题角色(RealSubject)角色
    /// </summary>
    public  class RealSubject : Subject
    {
        // 方法
        public override void Request()
        {
            Console.WriteLine("Called RealSubject.Request()");
        }
    }

    /// <summary>
    /// 代理主题(Proxy)角色
    /// </summary>
    public class Proxy : Subject
    {
        // 变量字段
        RealSubject realSubject;
        // 从写方法
        public override void Request()
        {
            if (realSubject == null)
                realSubject = new RealSubject();
            preRequest();
            realSubject.Request();
            postRequest();
        }
        public void preRequest()
        { Console.WriteLine("PreRequest."); }
        public void postRequest()
        { Console.WriteLine("PostRequest."); }

    }
原文地址:https://www.cnblogs.com/dragon-L/p/3780181.html