不去修改已有的类,而是通过创建另外一个装饰器类,通过这个装饰器类去动态的扩展需要修改的内容。
interface decorator
{
function before_do();
function after_do();
}
class user
{
private $decorate_arr = array();
/*
* 装饰对象的eat方法,此方法作为例子
*/
public function eat()
{
$this->before_do();
echo '开始吃饭<br/>';
$this->after_do();
}
/*
* 添加装饰器
*/
public function add_decorate(decorator $decorator)
{
$this->decorate_arr[] = $decorator;
}
/*
* 遍历装饰器,调用装饰器方法
*/
public function before_do()
{
foreach ($this->decorate_arr as $decorator) {
$decorator->before_do();
}
}
/*
* 遍历装饰器,调用装饰器方法
*/
public function after_do()
{
foreach ($this->decorate_arr as $decorator) {
$decorator->after_do();
}
}
}
// 装饰器1
class decorator1 implements decorator
{
public function before_do()
{
echo '先去洗手<br/>';
}
public function after_do()
{
echo '吃饱了,是时候看一波球了<br/>';
}
}
// 装饰器2
class decorator2 implements decorator
{
public function before_do()
{
echo '洗完手然后擦一下<br/>';
}
public function after_do()
{
echo '都是真球,不错不错<br/>';
}
}
// 实例化被装饰对象
$user = new user();
// 添加装饰器
$user->add_decorate(new decorator1());
$user->add_decorate(new decorator2());
// 调用方法
$user->eat();