代理模式(Proxy Pattern)

一、什么是代理模式

在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。这就是本文要说的Proxy模式。

意图:
为其他对象提供一种代理以控制对这个对象的访问。 

结构图:

代理模式涉及的角色: 

  • 抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。
  • 代理主题角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。
  • 真实代理对象.定义了代理角色所代表的具体对象。

 

二、代理模式的例子

举一个好玩的例子:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理。

先定义一种类型的女人(一种类型嘛,那肯定是接口)—— 抽象主题角色 :

1 //定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
2 public interface IKindOfWoman
3 {
4 //这种类型的女人能做什么事情呢?
5 void MakeEyesWithMan(); //向男人抛媚眼
6
7 void MakeHappyWithMan(); //和男人寻欢
8 }

然后定义潘金莲(让潘金莲类实现前面定义的那个接口)—— 真实代理对象

 1 //定一个潘金莲是什么样的人
2 public class PanJinLian : IKindOfWoman
3 {
4
5 public void MakeEyesWithMan()
6 {
7 Console.WriteLine("潘金莲在向男人抛媚眼。。。");
8 }
9
10 public void MakeHappyWithMan()
11 {
12 Console.WriteLine("潘金莲和男人在寻欢。。。");
13 }
14 }

再定义王婆( 让王婆类实现前面定义的那个接口,代理必须知道被代理对象能做什么)—— 代理主题角色

 1 //王婆这个人老聪明了,她太老了,是个男人都看不上,
2 //但是她有智慧有经验呀,她作为一类女人的代理!
3 public class WangPo : IKindOfWoman
4 {
5 private PanJinLian panJinLian;
6
7 //默认的话,是潘金莲的代理
8 public WangPo()
9 {
10 if (null == panJinLian)
11 {
12 panJinLian = new PanJinLian();
13 }
14 }
15
16 //她可以是IKindOfWoman的任何一个女人的代理,只要你是这一类型
17 public WangPo(PanJinLian panJinLian)
18 {
19 this.panJinLian = panJinLian;
20 }
21
22 //王婆这么大年龄了,谁看她抛媚眼?!
23 public void MakeEyesWithMan()
24 {
25 panJinLian.MakeEyesWithMan();
26 }
27
28 //自己老了,干不了,可以让年轻的代替
29 public void MakeHappyWithMan()
30 {
31 panJinLian.MakeHappyWithMan();
32 }
33 }

接下 来西门庆要出场了(也就是客户端代码)

 1 //定义一个西门庆,这人色中饿鬼
2 public class XiMenQing
3 {
4 public static void Main(string[] args)
5 {
6 WangPo wangpo = new WangPo();
7
8 wangpo.MakeEyesWithMan();
9 wangpo.MakeHappyWithMan();
10
11 Console.Read();
12 }
13 }
posted @ 2012-04-05 23:21  技术勇者  阅读(542)  评论(0编辑  收藏  举报