// 装饰器接口
interface Decorator
{
function beforeDecorator();
function afterDecorator();
}
// 改变颜色的装饰器
class ColorDecorator implements Decorator
{
function __construct( $color="red" )
{
$this->color = $color;
}
function beforeDecorator()
{
echo "<div style='color:{$this->color}'>";
}
function afterDecorator()
{
echo '<div>';
}
}
// 改变字体大小的装饰器
class SizeDecorator implements Decorator
{
function __construct( $size="12px" )
{
$this->size = $size;
}
// 代码之前插入
function beforeDecorator()
{
echo "<div style='font-size:{$this->size}'>";
}
// 代码之后插入
function afterDecorator()
{
echo '<div>';
}
}
class Test
{
protected $decorators = array();
function index()
{
$this->befor();
echo '这是一个装饰器模式的小栗子';
$this->after();
}
function befor()
{
foreach ($this->decorators as $key => $decorator) {
$decorator->beforeDecorator();
}
}
function after()
{
$this->decorators = array_reverse($this->decorators);
foreach ($this->decorators as $key => $decorator) {
$decorator->afterDecorator();
}
}
function addDecorator( $decorator )
{
$this->decorators[] = $decorator;
}
}
$test = new Test();
$test->addDecorator( new ColorDecorator('blue') );
$test->addDecorator( new SizeDecorator('24px') );
$test->index();