代理模式

以黄牛买票为例

  • UML图:

代理模式

  • 代码实现:
public interface IPayTicket
    {
        /// <summary>
        /// 买票
        /// </summary>
        /// <returns></returns>
        bool BuyTicket();
    }


 public class RealPayTicket : IPayTicket
    {
        public bool BuyTicket()
        {
            Console.WriteLine("去买票");
            return true;
        }
    }

/// <summary>
    /// 黄牛代理买票
    /// </summary>
    public class ProxyPayTicket : IPayTicket
    {
        public IPayTicket objPayTicket;

        public ProxyPayTicket(IPayTicket payTicket)
        {
            this.objPayTicket = payTicket;
        }
        public bool BuyTicket()
        {
            Console.WriteLine("我是黄牛票贩");//额外做的事情
            var result = this.objPayTicket.BuyTicket();
            Console.WriteLine("记录下购买记录:{0}", result);//额外做的事情
            return result;
        }
    }
  • 另类的委托代理
    public class ProxyPayTicket2
        {
            public bool BuyTicket(Func<bool> fuc)
            {
                Console.WriteLine("我是黄牛票贩");//额外做的事情
                var result = fuc();
                Console.WriteLine("记录下购买记录:{0}", result);//额外做的事情
                return result;
            }
        }

     

  • 调用端代码:
 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*********************自己买票**********************");
            RealPayTicket realPayTicket = new RealPayTicket();
            var result1 = realPayTicket.BuyTicket();
            Console.WriteLine("自己买票结果:{0}",result1);

            Console.WriteLine("*********************黄牛1代理买票**********************");
            ProxyPayTicket proxyPayTicket = new ProxyPayTicket(realPayTicket);
            var result2 = proxyPayTicket.BuyTicket();
            Console.WriteLine("黄牛1代理买票结果:{0}", result2);

            Console.WriteLine("*********************黄牛2代理买票**********************");
            ProxyPayTicket2 payTicket2 = new ProxyPayTicket2();
            var result3 = payTicket2.BuyTicket(realPayTicket.BuyTicket);
            Console.WriteLine("黄牛2代理买票结果:{0}", result3);

            Console.ReadLine();
        }
    }
  • 总结:

代理模式主要的核心就是可以让在正在的对象产生动作的前后,可以进行外部干预,例如加日志,做参数验证等等

代码下载地址:链接:https://pan.baidu.com/s/1kDLYnVNv0_e3qN65Fq_Alg     提取码:nzjc