代理模式——为其他对象提供一种代理以控制对这个对象的访问。
代理模式一个应用很广泛的模式,它是建立在对象和引用对象之间,当需要访问一个对象时,可能会因为一些特殊原因造成一些困难,这样就会用到代理模式。
1.Subject类,这个是一个抽象接口,代理和对象的公共接口,这样任何要对对象进行访问的地方,就可以访问代理了。
1 /// <summary> 2 /// 公共接口 3 /// </summary> 4 public abstract class Subject 5 { 6 /// <summary> 7 /// 定义了一个抽象方法 8 /// </summary> 9 public abstract void Request(); 10 }
2.RealSubject类,定义一个真实提示,提供真实的对象和具体的操作
1 public class RealSubject :Subject 2 { 3 public override void Request() 4 { 5 //真实的实体动作 6 } 7 }
3.Proxy类,代理类,这里面保存了一个使用代理可以真实访问的实体,代理可以代替实体给外部进行访问,并且代理内部可以进行一些额外的操作。
1 /// <summary> 2 /// 创建一个代理类 3 /// </summary> 4 public class Proxy : Subject 5 { 6 //创建一个真实对象 7 private RealSubject realSubject; 8 9 /// <summary> 10 /// 代理创建自己的方法 11 /// 供外部进行调用 12 /// </summary> 13 public override void Request() 14 { 15 //加入真实对象没有创建,就创建一个,并且可以做一些额外的事。 16 if (realSubject == null) 17 { 18 realSubject = new RealSubject(); 19 } 20 //请求真实对象的方法 21 realSubject.Request(); 22 } 23 }
4.客户端代码,创建代理,让代理去干活。
1 static void Main(string[] args) 2 { 3 //创建一个代理对象,让代理去实现方法 4 var proxy = new Proxy(); 5 proxy.Request(); 6 }
代理模式其实很简单,但是却非常强大,而且用处非常多,那么它会在那些场合用到呢?
(1)远程代理:为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。比如.net中的webService,这就是一个远程访问的代理。
(2)虚拟代理:当需要续建一个开销很大的对象时,通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能最优化,比如说加载一个很大的图片,可以通过代理先加载一个图片框,这样体验度会很高。
(3)安全代理:用来控制真实对象的访问权限。比如一个网站有游客和会员的访问权限,可以用代理去判断,是否加载会员的对象。
(4)智能指引:当调用真实对象时,代理处理一些另外的事务。
以上内容部分参考程杰的《大话设计模式》一书