【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

时间:2023-03-08 16:52:04
【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php
/**
 * 【装饰器模式 (decorator)】
 * 有时候发布一篇文章需要经过很多人手,层层处理
 */

header("Content-type: text/html; charset=utf-8");

/************************ 《装饰器模式 实现》 ************************/
//文章基础类
class BaseWz{
    protected $content; //定义文章内容属性
    protected $art=null; //定义一个文章对象
    public function __construct($content){
        $this->content = $content;
    }
    public function decorator(){
        return $this->content;
    }

}

//1.小编添加摘要,继承原始的文章类
class XiaobianWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        //调用父类的decorator方法,就可以把父类的content返回
        //$res = parent::decorator().'【新增摘要from小编】';
        //$res = $this->art->content.='【新增摘要from小编】';
        $res = $this->content = $this->art->decorator().'【新增摘要from小编】';
        return $res;
    }
}

//2.SEO人员添加优化信息
class SEOWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        $res = $this->content = $this->art->decorator().'【新增优化信息from SEOer】';
        return $res;
    }
}

//3.广告部添加广告信息
class ADWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        $res = $this->content = $this->art->decorator().'【新增广告信息from ADer】';
        return $res;
    }
}

//4. 后面可以任意添加...

/*开始调用*/
$content = "这就是一篇简单的文章";

$base_wz = new BaseWz($content); //这里传进去的$content是 文章内容
echo $base_wz->decorator();
echo '<br>----------------------------------------<br>';

$xb_wz = new XiaobianWz($base_wz); //这里传进去的 $base_wz 是上面的 “基础文章对象”
echo $xb_wz->decorator();
echo '<br>----------------------------------------<br>';

$seo_wz = new SEOWz($xb_wz); //这里传进去的 $xb_wz 是上面的 “小编文章对象”
echo $seo_wz->decorator();
echo '<br>----------------------------------------<br>';

$ad_wz = new ADWz($seo_wz); //这里传进去的 $seo_wz 是上面的 “SEO文章对象”
echo $ad_wz->decorator();
echo '<br>----------------------------------------<br>';