/** |
* 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 |