c#设计模式之代理模式(Proxy Pattern)
引言
代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受到的其实就是火车站售票处的服务,同时我们还能够在代理点享受到火车站售票处没有的服务,例如代理点有个自动售货机,我们还能够享受到购物的服务.这就是代理的优势所在
在设计模式中也有那么一种模式,与代理这个定义紧密相连,下面我将以最简洁的代码展示它
1 /// <summary> 2 /// 业务抽象 3 /// </summary> 4 public interface ISubject 5 { 6 void GetTicket(); 7 }
1 /// <summary> 2 /// 真正的逻辑对象 3 /// </summary> 4 public class RealSubject : ISubject 5 { 6 public void GetTicket() 7 { 8 Console.WriteLine(".....取票动作....."); 9 } 10 }
1 /// <summary> 2 /// 真正业务对象的代理 3 /// </summary> 4 class ProxySubject:ISubject 5 { 6 private static ISubject _subject = null; 7 8 void ProxySubject_Init() 9 { 10 if (_subject == null) 11 { 12 _subject = new RealSubject(); 13 } 14 } 15 16 public void GetTicket() 17 { 18 if (_subject == null) 19 { 20 ProxySubject_Init(); 21 } 22 //AOP:日志,缓存,权限,延迟,异常 23 _subject.GetTicket(); 24 } 25 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var proxy = new ProxySubject(); 6 proxy.GetTicket(); 7 Console.ReadKey(); 8 } 9 }
观察上述代码我们发现它有以下特点
1上端调用的不是真实的业务对象,而是它的一个代理,真实的业务逻辑被隔离
2在代理之内,我们还能额外的定义其他的逻辑,而不影响真实的业务逻辑
这就是一个代理模式
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
代理模式
因为代理本身就是一个比较简洁的思想,所以代理模式的类图也比较简单,如下:
代理模式中有三种角色:
主题的抽象角色(ISubject):真实主题和代理主题的抽象
真实的主题角色(RealSubject):真实主题,提供最根本的业务逻辑
主题的代理角色(ProxySubject):真实主题的代理,能够引用真实主题,同时添加一些额外的功能
注意:提供业务逻辑的是真实主题,而不是代理,代理只是起到引用的作用,同时可以增加一些额外的功能
相交装饰器模式
在设计模式里面,有一种设计模式叫做装饰器模式,它能够动态的为对象添加功能,
如果对这两种模式都有所了解的话,会发现他们其实有很多共同之处,同样都是具体对象与辅助对象依赖抽象的方式
例如,我们想为对象添加一个日志的功能:我们既可以选择为它添加一个代理来实现,也可以选择添加一个装饰器来实现,这个时候我们可能会迷惑,添加的到底是代理还是装饰器
对于它们的区别,从他们出发的场景来比较是最好的,从出发场景来看,装饰器模式注重的是对原有对象功能的扩展,而代理模式注重的是对原有对象的控制或屏蔽,个人觉得这是他们最大的区别
适用场景
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
优点:
1降低了系统的耦合度,这是设计模式比较共通的优点;
2能够屏蔽真实的业务逻辑,同时还能额外增加功能
缺点
使用了代理模式,需要增加代理类,必然会增加系统的复杂程度
出自:博客园-半路独行
原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。