PHP设计模式-代理模式

概念理解:

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

参与者:

client(参与者):取决于主体(Subject)实现

subject(主体):RealSubject的抽象

realSubject(真实主体):完成代价高昂的工作或包含大量的数据

proxy(代理):为Client提供一个与Subject一致的引用,仅在需要时才创建realSubject实例或与RealSubject实例通信

关系模型:

 

代码展示:

 \Libs\Subject.php

<?php
namespace Libs;

interface Subject
{
    public function getWidth();
    public function getHeight();
    public function getPath();
    public function dump();
}

\Libs\AbstractSubject.php

<?php
namespace Libs;

abstract class AbstractSubject implements Subject
{
    protected $_width;
    protected $_height;
    protected $_path;
    protected $_data;
    public function getWidth()
    {
        return $this->_width;
    }
    public function getHeight()
    {
        return $this->_height;
    }
    public function getPath()
    {
        return $this->_path;
    }

}

\Libs\RealSubject.php

<?php
namespace Libs;

class RealSubject extends AbstractSubject
{
    public function __construct($path)
    {
        echo "D<br/>";
        $this->_path = $path;
        list($this->_width,$this->_height) = getimagesize($path);
        $this->_data = file_get_contents($path);
        
    }
    public function dump()
    {
        echo "F<br/>";
        return $this->_data;
    }
}

\Libs\Proxy.php

<?php
namespace Libs;

class Proxy extends AbstractSubject
{
    private $_realImage;
    public function __construct($path)
    {
        echo "A<br/>";
        $this->_path = $path;
        list($this->_width,$this->_height) = getimagesize($path);
    }
    
    protected function _lazyLoad()
    {
        echo "C<br/>";
        if($this->_realImage === null){
            $this->_realImage = new RealSubject($this->_path);
        }
    }
    public function dump()
    {
        echo "B<br/>";
        $this->_lazyLoad();
        echo "E<br/>";
        return $this->_realImage->dump();
    }
}

\Libs\PClient.php

<?php
namespace Libs;

class PClient
{
    public function tag(Subject $sub)
    {
        return $sub->dump();
    }
}

调用:

$path = "pclient.png";
$client = new PClient();
 
$realSubject = new RealSubject($path);
$client->tag($realSubject);
echo "<hr/>";
$proxy = new Proxy($path);
$client->tag($proxy);

结果:

D
F
_____________________________________________
A
B
C
D
E
F

 

 

推荐阅读>>

 

PHP设计模式漫谈之代理模式

PHP设计模式——代理模式

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

《PHP设计模式介绍》第十一章 章代理模式

PHP的代理模式

posted @ 2016-06-30 11:01  DDDDemo  阅读(340)  评论(0编辑  收藏  举报