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