(1)虚代理:可以根据需要来创建“大”对象,只有到必须创建对象的时候,虚代理才会去创建对象,从而大大加快程序运行速度,并节省资源。通过虚代理可以对系统进行优化。如开发一个大文档查看软件(如图片100MB),在打开文件前,先显示缩略图,而不是将所有图片都显示出来,在需要查看图片时,再用Proxy来进行大图片的打开)
(2)保护代理:可以在访问一个对象的前后,执行很多附加的操作,除了进行权限控制之外,还可以进行很多跟业务相关的处理,而不需要修改被代理的对象。也就是说,可以通过代理来给目标对象增加功能。
(3)Copy-on-write代理:也是虚代理的一个分支,在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标的对象。在实现Copy-on-write时必须对目标对象进行引用计数。代理仅会增加引用。只有当用户请求一个修改目标对象的操作时,代理才会真正的拷贝它。在这种情况下,代理还必须减少目标对象的引用次数。当引用计数为0时,将目标对象删除。
(4)远程代理:隐藏了一个对象存在于不同地址空间的事实,也即是客户通过远程代理去访问一个对象,根本就不关心这个对象在哪里,也不关心如何通过网络去访问到这个对象,从客户的角度来看,它只是在使用代理对象而己。
(5)智能指针:和保护代理类似,也是允许在访问一个对象的前后,执行很多附加的操作,这样一来就可以做很多额外的事情,比如引用计数、第1次引用一个持久对象时,将它载入内存、在访问一个实际对象前,检查是否己经锁定了它,以确保其他对象不能改变它等。
(6)Cache代理:为那些昂贵操作的结果提供临时的存储空间,以便多个客户端可以共享这些结构。
(7)防火墙代理:保护对象不被恶意用户访问或操作。
(8)同步代理:使多个用户能够同时访问目标对象而没有冲突。
代理的优点
(1)职责清晰:RealSubject就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成其他事务,附带的结果就是编程简洁清晰。
(2)可扩展性好:RealSubject可以随时变化,只要它实现了接口,甭管如何变化,代理可以在完全不做任何修改的情况下使用。
代理的使用场景
(1)需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理
(2)需要按照需要创建开销很大的对象的