博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 代理模式
阅读量:4087 次
发布时间:2019-05-25

本文共 1329 字,大约阅读时间需要 4 分钟。

代理模式

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.个人心得

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

推荐代理模式博文:

作者:ljianhui

你可能感兴趣的文章
webservice知识一、SOAP风格的webservice——通过JDK的API发布一个webservice服务和创建一个webservice客户端用于访问该服务
查看>>
JavaEE开发之Spring中的多线程编程以及任务定时器详解(有源码)
查看>>
JS实现2,8,10,16进制的相互转换
查看>>
mysql的存储函数和存储过程
查看>>
nginx和ftp搭建图片服务器
查看>>
solr5.5基础教程
查看>>
Java中的Zip进行多文件的保存
查看>>
微信扫码支付官方下载的demo本地运行时遇到的坑以及对应解决方法
查看>>
关于js中连续click时不执行访问后台请求,当点击停止2s之后,立即发起访问后台的请求的解决方案
查看>>
RESTClient工具访问服务如何传参
查看>>
MySQL中的分组查询与连接查询语句
查看>>
浮点数精度控制方式总结(含mysql和java)
查看>>
并发限流工具类RateLimiter介绍
查看>>
如何配置Tomcat使用https协议
查看>>
linux下安装mariadb以及相关配置
查看>>
Java中的Gzip进行多文件的保存
查看>>
Java中的Future模式原理自定义实现
查看>>
vmware桥接模式下,配置centos的ip地址网关等,搭建局域网服务器
查看>>
xstream练习
查看>>
调度框架Quartz
查看>>