// 装饰器接口 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();