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 相关文章推荐
PHP出错界面
Oct 09 PHP
简单易用的计数器(数据库)
Oct 09 PHP
php面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
php生成扇形比例图实例
Nov 06 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
PHP中require和include路径问题详解
Dec 25 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 PHP
aec加密 php_php aes加密解密类(兼容php5、php7)
Mar 14 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
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python第三方库的安装方法总结
2016/06/06 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python 列表降维的实例讲解
2018/06/28 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
药剂专业学生求职信范文
2013/12/28 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
老乡会致辞
2015/07/28 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
实例详解Python的进程,线程和协程
2022/03/13 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers