php设计模式Proxy(代理模式)
2023-06-13 09:14:29 时间
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务。而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,代理会帮他处理。
代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。
代理模式涉及的角色:
抽象主题角色,声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。
代理主题角色,含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题。代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。
真实代理对象,定义了代理角色所代表的具体对象。
参考一下代码:
复制代码代码如下:
代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。
代理模式涉及的角色:
抽象主题角色,声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。
代理主题角色,含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题。代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。
真实代理对象,定义了代理角色所代表的具体对象。
参考一下代码:
<?php
/**
*代理模式
*
*为其他对象提供一个代理以控制这个对象的访问
*
*/
interfaceProxy
{
publicfunctionrequest();
publicfunctiondisplay();
}
classRealSubject
{
publicfunctionrequest()
{
echo"RealSubjectrequest<br/>";
}
publicfunctiondisplay()
{
echo"RealSubjectdisplay<br/>";
}
}
classProxySubject
{
private$_subject=null;
publicfunction__construct()
{
$this->_subject=newRealSubject();
}
publicfunctionrequest()
{
$this->_subject->request();
}
publicfunctiondisplay()
{
$this->_subject->display();
}
}
$objProxy=newProxySubject();
$objProxy->request();
$objProxy->display();
代理模式的工作方式:首先,因为代理主题和真实主题都实现了共同的接口,这使我们可以在不改变原来接口的情况下,只要用真实主题对象的地方,都可以用代理主题来代替。其次,代理主题在客户和真实主题之间起了一个中介作用,利用这个中介平台,我们可以在把客户请求传递给真实主题之前做一些必要的预处理。
还有一个很常见的代理模式的使用例子就是对大幅图片浏览的控制。在我们常见的网站上面浏览图文的信息时,不知道你有没有注意到,图片位置放置的是经过缩小的,当有人要仔细的查看这个图片时,可以通过点击图片来激活一个链接,在一个新的网页打开要看的图片。这样对于提高浏览速度是很有好处的,因为不是每个人都要去看仔细图上的信息。这种情况就可以使用代理模式来全面实现。这里我将思路表述出来,至于实现由于工作原因,就不表述了,至于这种方式在B/S模式下的真实可行性,我没有确认过,只是凭空的想象。如果不是可行的方式,那这个例子可以放到一个C/S下来实现,这个是绝对没有问题的,而且在很多介绍设计模式的书和文章中使用。两种方式的实现有兴趣的可以来尝试一下:)
我们在浏览器中访问网页时是调用的不是真实的装载图片的方法,而是在代理对象中的方法,在这个对象中,先使用一个线程向浏览器装载了一个缩小版的图片,而在后台使用另一个线程来调用真实的装载大图片的方法将图片加载到本地,当你要浏览这个图片的时候,将其在新的网页中显示出来。当然如果在你想浏览的时候图片尚未加载成功,可以再启动一个线程来显示提示信息,直到加载成功。
这样代理模式的功能就在上面体现的淋漓尽致——通过代理来将真实图片的加载放到后台来操作,使其不影响前台的浏览。
代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。不过一定要记住前面讲的使用代理模式的条件,不然的话使用了代理模式不但不会有好的效果,说不定还会出问题的。
相关文章
- 【说站】php命令模式如何理解
- php写入配置文件的经典漏洞
- PHP - 语言底层运行及生命周期
- [PHP] apache在worker模式配置fastcgi使用php-fpm详解编程语言
- php图片水印类详解编程语言
- PHP操作MySQL:实现数据库写入操作(php写入mysql)
- 使用PHP执行Linux脚本:简单而快速!(php执行linux脚本)
- 快速访问MSSQL数据库:PHP实现(php访问mssql)
- 搭建 PHP 环境,在 Linux 系统里更轻松!(php环境linux)
- Linux环境下实现PHP文件上传(linuxphp上传)
- 操作快速使用PHP Redis操作实现数据删除(phpredis删除)
- 使用PHP连接Oracle数据库(php连接oracle)
- 、mysqlLinux安装PHP和MySQL的指南(linux 安装php)
- PHP如何开启MSSQL支持?(php怎么开启mssql)
- 使用PHP封装MSSQL管理数据库(php封装mssql)
- PHP与MSSQL联合 处理日期数据(php mssql 日期)
- PHP与MSSQL结合提高工作效率(php mssql 效率)
- 使用php从mssql导出数据的方法(php mssql 导出)
- 仅用PHP操作MSSQL,实现快速下载!(php mssql下载)
- 菜鸟学习Redis提升PHP运行效率(菜鸟 redis php)
- 混合开发助力企业信息化C语言PHP和MySQL联动提升系统性能(c php mysql)
- PHP中基本符号及使用方法
- PHP第一季视频教程(李炎恢+php100不断更新)
- php中用foreach来操作数组的代码
- php中is_null,empty,isset,unset的区别详细介绍
- PHP编程风格规范分享
- php使用codebase生成随机数
- php读取flash文件高宽帧数背景颜色的方法