参考:http://imhuchao.com/1498.html

当前有一个功能完善的对象,如果我们想要给这个对象添加一个新的职责,那么我们可以用一个新的类去装饰它来实现对原有对象职责的扩展。
新的类称为“装饰者”,原有的对象称为“被装饰者”。这种模式被称为装饰器模式。


例子:文章编辑,基础文章需要装饰(小编给文章加摘要,seo人员添加seo关键字)

<?php
/**
 * 装饰器模式,完成文章修饰功能
 * 装饰器模式: 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。而不用修改原先对象或派生类
 *         而我们也应该尽量使用“对象组合”,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。
 *         装饰器模式的本质就是“动态组合”。动态是手段,组合才是目的。
 *         总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来“动态组合”的这样一个模式。
 * 在以下两种情况下可以考虑使用装饰器模式:
 *  (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。
 *  (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。  
 *
 */


/**
 * 文章基础类
 *
 */
class BaseArt{
    /**
     * 文章内容
     * @var string
     */
    protected $content;

    /**
     * 这是个BaseArt对象
     * @var BaseArt
     */
    protected $art = null;

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

    public function decorator(){
        return $this->content;
    }
}

/**
 * 装饰类
 * 小编给文章加摘要
 *
 */
class BianArt extends BaseArt{
    public function __construct(BaseArt $art){
        $this->art = $art;
        $this->decorator();
    }

    public function decorator() {
        return $this->content = $this->art->decorator(). '小编摘要<br />';
    }
}

/**
 * 装饰类
 * seo人员添加seo关键字
 *
 */
class SeoArt extends BaseArt{
    public function __construct(BaseArt $art){
        $this->art = $art;
        $this->decorator();
    }

    public function decorator() {
        return $this->content = $this->art->decorator(). 'seo 关键词<br />';
    }
}


$bian = new BianArt(new BaseArt('文章基础内容<br />'));
echo $bian->decorator();

echo '<br />-------------------------------------------<br /><br />';

$seo = new SeoArt($bian);
echo $seo->decorator();