装饰者模式将系统中的基类进行抽象,拆分为一个主的装饰者和其他的组件。
例如,以饮料为例(head first 设计模式)中的为例,我们需要做针对不同的饮料,而又需要加入不同的配方,就使用到了装饰者模式。
我们对饮料进行一个抽象 abstract class beverage
我们又对组件进行一个抽象。 class Component extends beverage

对于主要的基本的使用的装饰者,直接继承自beverage
对于其他的用来对装饰者进行修饰的组件,继承自组件抽象使用的类class Component

这样,对于一个特定的具有不同的组件,我们就可进行嵌套装饰。如下

#!/usr/bin/env php
<?php
//定义饮料抽象基类
abstract class Beverage {

    //定义抽象cost方法
    public function cost() {
        return $this->_cost();
    }

    abstract protected function _cost();
} 

//定义组件基类,由于具有相同的方法等,直接继承自Beverage
abstract class Component extends Beverage {

    //存储被装饰者对象
    public $_decorator;

    public function __construct(Beverage $decorator) {         
        $this->_decorator = $decorator;
    }

    //进行自身价格获取和装饰者价格获取后累加
    public function cost() {
        return $this->_decorator->cost() + $this->_cost();
    }
}

class Coffee extends Beverage {

    public function _cost() {
        return 0.1;
    }
}

class Milk extends Component {

    protected function _cost() {
        return 0.2;
    }
}

class Soy extends Component {

    protected function _cost() {
        return 0.3;
    }
}

$deverage  = new Coffee();
$deverage = new Milk($deverage);
$deverage = new Soy($deverage);

echo $deverage->cost();

我们先进行一个抽象的beverage类定义,然后由于是要进行装饰,说明具有相同的方法,我们再进行一个Component组件的抽象,并且组件Component继承自Beverage

首先我们定义了一个基本的Beverage类(coffee类)
又定义了一个Mile的Component类,组件类
还有Soy的Component类,组件类

先进行了被装饰者(装饰者)的实例化,然后使用组件对实例化后的对象依次进行装饰

最后获取装饰所需要的信息。

装饰者模式需要注意有多个类、对象进行叠加修饰。

拓展阅读:http://www.cnblogs.com/baochuan/archive/2012/02/28/2371521.html