设计模式——代理模式

  代理模式——为其他对象提供一种代理以控制对这个对象的访问。

  代理模式一个应用很广泛的模式,它是建立在对象和引用对象之间,当需要访问一个对象时,可能会因为一些特殊原因造成一些困难,这样就会用到代理模式。

1.Subject类,这个是一个抽象接口,代理和对象的公共接口,这样任何要对对象进行访问的地方,就可以访问代理了。

 1 /// <summary>
 2 /// 公共接口
 3 /// </summary>
 4 public abstract class Subject
 5 {
 6     /// <summary>
 7     /// 定义了一个抽象方法
 8     /// </summary>
 9     public abstract void Request();
10 }
Subject.cs

2.RealSubject类,定义一个真实提示,提供真实的对象和具体的操作

1 public class RealSubject :Subject
2 {
3     public override void Request()
4     {
5         //真实的实体动作
6     }
7 }
RealSubject .cs

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 }
Proxy .cs

4.客户端代码,创建代理,让代理去干活。

1 static void Main(string[] args)
2 {
3     //创建一个代理对象,让代理去实现方法
4     var proxy = new Proxy();
5     proxy.Request();
6 }
Main

  代理模式其实很简单,但是却非常强大,而且用处非常多,那么它会在那些场合用到呢?

  (1)远程代理:为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。比如.net中的webService,这就是一个远程访问的代理。

  (2)虚拟代理:当需要续建一个开销很大的对象时,通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能最优化,比如说加载一个很大的图片,可以通过代理先加载一个图片框,这样体验度会很高。

  (3)安全代理:用来控制真实对象的访问权限。比如一个网站有游客和会员的访问权限,可以用代理去判断,是否加载会员的对象。

  (4)智能指引:当调用真实对象时,代理处理一些另外的事务。

                                                          以上内容部分参考程杰的《大话设计模式》一书

 

posted @ 2013-05-23 22:28  Kitten Zhang  阅读(123)  评论(0编辑  收藏  举报