php设计模式 Proxy (代理模式)


Posted in PHP onJune 26, 2011

代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务。而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,代理会帮他处理。

代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。

代理模式涉及的角色:

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

<?php 
/** 
* 代理模式 
* 
* 为其他对象提供一个代理以控制这个对象的访问 
* 
*/ 
interface Proxy 
{ 
public function request(); 
public function display(); 
} class RealSubject 
{ 
public function request() 
{ 
echo "RealSubject request<br/>"; 
} 
public function display() 
{ 
echo "RealSubject display<br/>"; 
} 
} 
class ProxySubject 
{ 
private $_subject = null; 
public function __construct() 
{ 
$this->_subject = new RealSubject(); 
} 
public function request() 
{ 
$this->_subject->request(); 
} 
public function display() 
{ 
$this->_subject->display(); 
} 
} 
$objProxy = new ProxySubject(); 
$objProxy->request(); 
$objProxy->display();

代理模式的工作方式:首先,因为代理主题和真实主题都实现了共同的接口,这使我们可以在不改变原来接口的情况下,只要用真实主题对象的地方,都可以用代理主题来代替。其次,代理主题在客户和真实主题之间起了一个中介作用,利用这个中介平台,我们可以在把客户请求传递给真实主题之前做一些必要的预处理。

还有一个很常见的代理模式的使用例子就是对大幅图片浏览的控制。在我们常见的网站上面浏览图文的信息时,不知道你有没有注意到,图片位置放置的是经过缩小的,当有人要仔细的查看这个图片时,可以通过点击图片来激活一个链接,在一个新的网页打开要看的图片 。这样对于提高浏览速度是很有好处的,因为不是每个人都要去看仔细图上的信息。这种情况就可以使用代理模式来全面实现。这里我将思路表述出来,至于实现由于工作原因,就不表述了,至于这种方式在B/S模式下的真实可行性,我没有确认过,只是凭空的想象。如果不是可行的方式,那这个例子可以放到一个C/S下来实现,这个是绝对没有问题的,而且在很多介绍设计模式的书和文章中使用。两种方式的实现有兴趣的可以来尝试一下:)

我们在浏览器中访问网页时是调用的不是真实的装载图片的方法,而是在代理对象中的方法,在这个对象中,先使用一个线程向浏览器装载了一个缩小版的图片,而在后台使用另一个线程来调用真实的装载大图片的方法将图片加载到本地,当你要浏览这个图片的时候,将其在新的网页中显示出来。当然如果在你想浏览的时候图片尚未加载成功,可以再启动一个线程来显示提示信息,直到加载成功。

这样代理模式的功能就在上面体现的淋漓尽致——通过代理来将真实图片的加载放到后台来操作,使其不影响前台的浏览。

代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。不过一定要记住前面讲的使用代理模式的条件,不然的话使用了代理模式不但不会有好的效果,说不定还会出问题的。

PHP 相关文章推荐
在数据量大(超过10万)的情况下
Jan 15 PHP
收集的php编写大型网站问题集
Mar 06 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
Smarty分页实现方法完整实例
May 11 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
关于PHP求解三数之和问题详析
Nov 09 PHP
php设计模式 Composite (组合模式)
Jun 26 #PHP
php设计模式 State (状态模式)
Jun 26 #PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 #PHP
php设计模式 FlyWeight (享元模式)
Jun 26 #PHP
php设计模式 Mediator (中介者模式)
Jun 26 #PHP
php设计模式 Prototype (原型模式)代码
Jun 26 #PHP
You might like
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php正则修正符用法实例详解
2016/12/29 PHP
自己编写的类似JS的trim方法
2013/10/09 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
vue实现分页栏效果
2019/06/28 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python装饰器基础详解
2016/03/09 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python实现逻辑回归的示例
2020/10/09 Python
python中添加模块导入路径的方法
2021/02/03 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
消防安全管理制度
2014/02/01 职场文书
食品业务员岗位职责
2014/03/18 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
银行授权委托书范本
2014/10/04 职场文书
个人作风建设心得体会
2014/10/22 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
2015年工程师工作总结
2015/04/30 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
《确定位置》教学反思
2016/02/18 职场文书
php去除deprecated的实例方法
2021/11/17 PHP