概念理解:
代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子。
参与者:
client(参与者):取决于主体(Subject)实现
subject(主体):RealSubject的抽象
realSubject(真实主体):完成代价高昂的工作或包含大量的数据
proxy(代理):为Client提供一个与Subject一致的引用,仅在需要时才创建realSubject实例或与RealSubject实例通信
关系模型:
代码展示:
LibsSubject.php
<?php namespace Libs; interface Subject { public function getWidth(); public function getHeight(); public function getPath(); public function dump(); }
LibsAbstractSubject.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; } }
LibsRealSubject.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; } }
LibsProxy.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(); } }
LibsPClient.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
推荐阅读>>