设计模式 代理模式

代理模式

1. 代理模式是什么?

在GOF的《设计模式:可复用面向对象软件的基础》一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问。
使用场合:

  • 远程代理为一个对象在不同的地址空间提供局部代理;
  • 虚代理根据需求创建开销很大的对象;
  • 保护代理控制原始对象的访问;保护代理用于对象应该有不同的访问权限的时候;
  • 智能引用取代了简单的指针,它在访问对象时执行一些附加操作,它的典型用途包括:
    对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它;
    当第一次引用一个持久对象时,将它装入内存;
    在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
2. 代理模式UML图

代理模式UML图

3. 智能指针并不符合代理模式的UML图,为什么说智能指针是代理模式?

你可以会产生疑问,智能指针真的应用了上面所说的代理模式吗?上面的代理模式不是要有一个Subject类、一个RealSubject类和一个Proxy类的吗?而RealSubject类和Proxy是Subject的子类,需要定义Subject的接口的吗?为什么这里只有一个类呢?

现在你看不出来,我并不怪你。看下去自然会明白。

智能指针,这里以share_ptr为例,它的目的就是通过一个类来模仿一个指针的行为,并提供指针没有的功能,就是当指针变量出了作用域后,自动处理指针指向的内存的功能。所以上面你看到的SharePtr模板类,就相当于Proxy类。

那RealSubject类呢?因为智能指针是指针的代理,那么RealSubject类当然就是SharePtr中的成员变量T,我觉得说是T类型的指针T*更加恰当。哈哈,奇妙吧!

那么Subject类呢?这里是什么充当这个类呢?从代理模式的类图可以看到Subject类定义的是RealSubject和Proxy的共有接口,你想想看,既然RealSubject是一个指针,那么它的操作就是*、->、==、!=和 = 这五种了,由于这些操作本来就是原生的操作,并不是什么特别的规定,所以在这里并没有这个Subject,但是可以看到,这些共有的接口或者说是操作,上面的SharePtr类中,还是有实现的。

换一个角度来说,*、->、==、!=和 =这五类操作就是Subject类中的接口,但是在这里并没有必要实现一个Subject的基类,然后让SharePtr来继承它。因为指针并不需要继承Subject就已经具有这五类操作了。所以这里把这个类省去了。

这下你应该明白,为什么这里的一个类就是一个代理模式了吧。其实我觉得学习设计模式最重要的还是学习它的思想,学习的解决问题的方法以及如何用它架构我们的程序,而不是对照着类图或者它的定义来生搬硬套。上面的智能指针就是一个例子。

3.个人心得

个人对代理模式了解不太熟悉,上面四种使用场合也仅仅接触过智能指针。给我感觉代理模式相当于一个管家,去管理某个类,那个类有它本来的属性和方法,让这个管家去做那个类自己做不到的事情(如智能指针中如果单纯是指针无法管理自己,需要一个管家去管理它)。也可以做一些类的使用前初始化工作和使用后的清理工作。

推荐代理模式博文:
http://blog.csdn.net/ljianhui/article/details/29451345
作者:ljianhui

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值