代理模式
以黄牛买票为例
- 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