美文网首页
设计模式(八):装饰器模式

设计模式(八):装饰器模式

作者: 何笙 | 来源:发表于2019-05-08 19:40 被阅读0次

装饰器模式(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')));

相关文章

网友评论

      本文标题:设计模式(八):装饰器模式

      本文链接:https://www.haomeiwen.com/subject/kxgvoqtx.html