装饰器模式(Decorator)
装饰器模式能够从一个对象的外部动态地给对象添加功能。
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。使用装饰器可以动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
关键代码:
Component 类充当抽象角色,不应该具体实现。
修饰类引用和继承 Component 类,具体扩展类重写父类方
//被装饰类
interface Renderer {
public function renderData();
}
class WebRender implements Renderer {
protected $data;
public function __construct($data) {
$this->data = $data;
}
public function renderData() {
return $this->data;
}
}
现在在不改动原有的类的基础上,增加renderXml和renderJson的功能。
//实现Renderer的抽象装饰类
abstract class Decorator implements Renderer {
protected $derectedRender;
public function __construct(Renderer $derectedRender) {
$this->derectedRenderd = $derectedRender;
}
//public function renderData() {
// $this->derectedRenderd->renderData() ;
//}
}
//实体装饰类
/**
* RenderInXml类
*/
class RenderInXml extends Decorator {
public function renderData()
{
$output = $this->derectedRenderd->renderData() ;
// do some fancy conversion to xml from array ...
$doc = new \DOMDocument();
foreach ($output as $key => $val) {
$doc->appendChild($doc->createElement($key, $val));
}
return $doc->saveXML();
}
}
/**
* RenderInJson类
*/
class RenderInJson extends Decorator {
public function renderData()
{
$output = $this->derectedRenderd->renderData() ;
return json_encode($output);
}
}
//client
$service = new RenderInXml(new WebRender(array('foo' => 'bar')));
网友评论