• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP设计模式之代理模式的深入解析_php技巧

php 搞代码 4年前 (2022-01-26) 23次浏览 已收录 0个评论

代理模式(Proxy),它是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理(Proxy)对象取代,代理对象位于客户端(Client)和真实执行程序之间,指针有一个可被多个目标利用的钩子。

从技术上讲,这种模式在客户端和真实主体(RealSubject)之间插入一个代理对象,维护subject接口和用不同的方式委派它的方法。代理可以透明地做任何事情:懒散创建RealSubject或载入数据,与其它机器交换消息,写时复制策略等。这与HTTP代理有点类似,其客户端(如浏览器)和应用程序依赖于与HTTP服务器的联系,代理在管理连接时可以完成其它任务,如访问控制和缓存大型下载文件。


代理模式的对象图与装饰模式对象图在结构上类似,但表达的目的各有不同,装饰者给对象动态增加行为,而代理则控制来自客户端的访问。此外,代理只在需要时才创建RealSubject。

参与者:
◆客户端(Client):取决于主体(Subject)实现;
◆主体(Subject):RealSubject的抽象;
◆真实主体(RealSubject):完成代价高昂的工作或包含大量的数据;
◆代理(Proxy):为Client提供一个与Subject一致的引用,仅在需要时才创建RealSubject实例或与RealSubject实例通信。

下面是两个被广泛使用的代理模式例子:
1、对象-关系映射(Orms)在运行中创建代理作为实体类的子类,以实现懒散加载(虚拟代理),这个代理会覆盖所有实体方法,在前面追加一个载入程序,在方法被真正调用前不会包含任何数据,Orms代理支持对象间的双向关系,不用加载整个数据库,因为它们被置于当前加载对象图的边界。

2、Java RMI使用远程代理对象(远程代理),当它们的方法被调用时,代理序列化参数,执行网络上的请求,委托调用另一个节点上的真实对象,这种技术允许透明地调用远程对象,不用担心它们是否在同一台机器上,但这种透明度很容易会使执行速度变慢。

下面的代码示例实现了一个ImageProxy,推迟了图像数据的加载。

/**  <BR> * Subject interface.  <BR> * Client depends only on this abstraction.  <BR> */ <BR>interface Image  <BR>{  <BR>    public function getWidth();  <br><br>    public function getHeight();  <br><br>    public function getPath();  <br><br>    /**  <BR>     * @return string   the image's byte stream  <BR>     */ <BR>    public function dump();  <BR>}  <br><br>/**  <BR> * Abstract class to avoid repetition of boilerplate code in the Proxy  <BR> * and in the Subject. Only the methods which can be provided without  <BR> * instancing the RealSubject are present here.  <BR> */ <BR>abstract class AbstractImage implements Image  <BR>{  <BR>    protected $_width;  <BR>    protected $_height;  <BR>    protected $_path;  <BR>    protected $_data;  <br><br>    public function getWidth()  <BR>    {  <BR> return $this->_width;  <BR>    }  <br><br>    public function getHeight()  <BR>    {  <BR> return $this->_height;  <BR>    }  <br><br>    public function getPath()  <BR>    {  <BR> return $this->_path;  <BR>    }  <BR>}  <br><br>/**  <BR> * The RealSubject. Always loads the image, even if no dump of the data  <BR> * is required.  <BR> */ <BR>class RawImage extends AbstractImage  <BR>{  <BR>    public function __construct($path)  <BR>    {  <BR> $this->_path = $path;  <BR> list ($this->_width, $this->_height) = getimagesize($path);  <BR> $this->_data = file_get_contents($path);  <BR>    }  <br><br>    publ<b style="color:transparent">(、本文来源gao@!dai!ma.com搞$$代^@码网*</b><i>搞gaodaima代码</i>ic function dump()  <BR>    {  <BR> return $this->_data;  <BR>    }  <BR>}  <br><br>/**  <BR> * Proxy. Defers loading the image data until it becomes really mandatory.  <BR> * This class does its best to postpone the very expensive operations  <BR> * such as the actual loading of the BLOB.  <BR> */ <BR>class ImageProxy extends AbstractImage  <BR>{  <BR>    public function __construct($path)  <BR>    {  <BR> $this->_path = $path;  <BR> list ($this->_width, $this->_height) = getimagesize($path);  <BR>    }  <br><br>    /**  <BR>     * Creates a RawImage and exploits its functionalities.  <BR>     */ <BR>    protected function _lazyLoad()  <BR>    {  <BR> if ($this->_realImage === null) {  <BR>     $this->_realImage = new RawImage($this->_path);  <BR> }  <BR>    }  <br><br>    public function dump()  <BR>    {  <BR> $this->_lazyLoad();  <BR> return $this->_realImage->dump();  <BR>    }  <BR>}  <br><br>/**  <BR> * Client class that does not use the data dump of the image.  <BR> * Passing blindly a Proxy to this class and to other Clients makes sense  <BR> * as the data would be loaded anyway when Image::dump() is called.  <BR> */ <BR>class Client  <BR>{  <BR>    public function tag(Image $img)  <BR>    {  <BR> return ';  <BR>    }  <BR>}  <br><br>$path = '/home/giorgio/shared/Immagini/kiki.png';  <BR>$client = new Client();  <br><br>$image = new RawImage($path); // loading of the BLOB takes place  <BR>echo $client->tag($image), "\n";  <br><br>$proxy = new ImageProxy($path);  <BR>echo $client->tag($proxy), "\n"; // loading does not take place even here <BR>


以上代码实现了PHP的代理模式。简单来讲,代理模式就是为其他对象提供一个代理以控制对这个对象的访问。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP设计模式之代理模式的深入解析_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址