【设计模式】结构型模式之Proxy代理
2016-08-21 10:50
162 查看
Proxy代理是一种对象结构型设计模式,意在为其它对象提供一种代理以控制对这个对象的访问,对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。
Proxy模式的结构如下图所示:
![](https://img-blog.csdn.net/20160821104940115)
上图中,Proxy保存一个引用使得代理可以访问实体,若RealSubject和Subject的接口相同,Proxy会引用Subject;Proxy提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体;Proxy控制对实体的存取,并可能负责创建和删除它。Subject定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。RealSubject定义Proxy所代表的实体。
常见的代理包括远程代理、虚代理、保护代理和智能引用。远程代理为一个对象在不同的地址空间提供局部代表,可以隐藏一个对象存在于不同地址空间的事实。虚代理根据需要创建开销很大的对象,可以进行最优化,例如根据要求创建对象。保护代理控制对原始对象的访问,用于对象应该有不同的访问权限的时候。智能引用取代了简单的指针,它在访问对象时执行一些附加操作。在实际情况中,代理根据其种类,在适当的时候向RealSubject转发请求。
Proxy模式还可以对用户隐藏另一种称之为copy-on-write的优化方式,该优化与根据需要创建对象有关,可以大幅度地降低拷贝庞大实体时的开销。拷贝一个庞大而复杂的对象是一种开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要,用代理延迟这一拷贝过程,可以保证只有当这个对象被修改的时候才对它进行拷贝。在实现copy-on-write时必须对实体进行引用计数,拷贝代理仅会增加引用计数,只有当用户请求一个修改该实体的操作时,代理才会真正的拷贝它,在这种情况下,代理还必须减少对实体的引用计数,当引用计数为零时,这个实体将被删除。
Proxy模式的结构如下图所示:
上图中,Proxy保存一个引用使得代理可以访问实体,若RealSubject和Subject的接口相同,Proxy会引用Subject;Proxy提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体;Proxy控制对实体的存取,并可能负责创建和删除它。Subject定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。RealSubject定义Proxy所代表的实体。
常见的代理包括远程代理、虚代理、保护代理和智能引用。远程代理为一个对象在不同的地址空间提供局部代表,可以隐藏一个对象存在于不同地址空间的事实。虚代理根据需要创建开销很大的对象,可以进行最优化,例如根据要求创建对象。保护代理控制对原始对象的访问,用于对象应该有不同的访问权限的时候。智能引用取代了简单的指针,它在访问对象时执行一些附加操作。在实际情况中,代理根据其种类,在适当的时候向RealSubject转发请求。
Proxy模式还可以对用户隐藏另一种称之为copy-on-write的优化方式,该优化与根据需要创建对象有关,可以大幅度地降低拷贝庞大实体时的开销。拷贝一个庞大而复杂的对象是一种开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要,用代理延迟这一拷贝过程,可以保证只有当这个对象被修改的时候才对它进行拷贝。在实现copy-on-write时必须对实体进行引用计数,拷贝代理仅会增加引用计数,只有当用户请求一个修改该实体的操作时,代理才会真正的拷贝它,在这种情况下,代理还必须减少对实体的引用计数,当引用计数为零时,这个实体将被删除。
相关文章推荐
- 第一章:Python基础の快速认识基本语法
- ios开发多选照片实现
- 我的Android之旅(二十)---Android控件属性大全
- 第2次编程作业
- Response对象通过字节流输出中文内容
- react native components
- Android热插拔事件处理详解
- web前端之 DOM
- python基础——切片
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
- ThinkPHP教程_PHP框架之ThinkPHP(二)【URL路径访问与模块控制器、URL四种模式、PATHINFO的两种模式、模板与控制器之间的关系】
- 进程
- openwrt toolchain 编译错误 *** [s-attrtab] Killed
- 同步通信与异步通信区别
- Java语言动态性
- android,屏幕翻转问题
- Spring Boot 使用 Druid 和监控配置
- Java 接口和抽象类的区别
- linux操作系统fork详解
- Codeforces Round #368 (Div. 2) C. Pythagorean Triples