PHP设计模式--装饰模式

67 阅读1分钟
<?php
/**
 * 装饰模式
 */
class Art{
    protected $cotent = null;

    public function __construct($cotent){
        $this->cotent = $cotent;
    }

    public function decorate(){
        return $this->cotent;
    }
}

class ArtDec extends Art{
    protected $art = null;

    public function __construct($art){
        $this->art = $art;
    }
    public function decorate(){

    }
}

class SeoArt extends ArtDec{
    public function decorate(){
        return $this->art->decorate().'seo keyword';
    }
}

class AdArt extends ArtDec{
    public function decorate(){
        return $this->art->decorate().'广告';
    }
}

$art = new Art('这是一篇文章');
$art = new SeoArt($art);
$art = new AdArt($art);
echo $art->decorate();


$seo = new Art('这是一篇seo文章');
$seo = new SeoArt($seo);
echo $seo->decorate();

$zz = new Art('这是一篇ad文章');
$zz = new AdArt($zz);
echo $zz->decorate();
  • 从代码中可以看出,我们是一直对具体的那个art对象来进行包装
  • 再往下的话其实我们是对他的decorate()这个方法包装了两次,每次都是在前一次的基础上加了一点点东西
  • 不要纠结于SeoArt和AdArt装饰器上的added属性和方法,他们只是GoF类图中用以区别这两个装饰器不是同一个东西,每个装饰器都可以干很多别的事,art对象也不一定只有decorate()这一个方法,我们可以选择性的去装饰对象中的全部或者部分方法

可以选择叠加用,也可以各自用。

感谢分享:十八哥 mp.weixin.qq.com/s?__biz=MzI…