装饰器模式,使得在一个类不能完全满足需求时对其进行一些特定的自定义处理,而无需要新创建一个类
<?php
// 可以动态的添加修改类的功能
class Canvas
{
public function init()
{
echo "init";
}
public function rect($top, $right, $bottom, $left)
{
echo $top, $right, $bottom, $left;
}
}
// 目标,为 rect 方法增加一个输出标题
/** 传统方法
class Canvas2 extends Canvas
{
public function rect($top, $right, $bottom, $left)
{
echo "++++", $top, $right, $bottom, $left;
}
}
$canvas = new Canvas2();
$canvas->init();
$canvas->rect(3,5,6,7);
*/
// 装饰器模式
class Danvas implements IDrawDecorator
{
private $decorators;
public function init()
{
echo "init";
}
public function rect($top, $right, $bottom, $left)
{
$this->beforeDraw();
echo $top, $right, $bottom, $left;
$this->afterDraw();
}
public function beforeDraw()
{
$decorators = array_reverse($this->decorators);
foreach ($decorators as $decorator) {
$decorator->beforeDraw();
}
}
public function afterDraw()
{
foreach ($this->decorators as $decorator) {
$decorator->afterDraw();
}
}
public function addDecorator(IDrawDecorator $decorator)
{
$this->decorators[] = $decorator;
}
}
interface IDrawDecorator
{
public function beforeDraw();
public function afterDraw();
}
abstract class ADrawDecorator
{
public abstract function beforeDraw();
public abstract function afterDraw();
}
class ColorDrawDecorator extends ADrawDecorator
{
public function beforeDraw()
{
echo "color before \n";
}
}
class SizeDrawDecorator extends ADrawDecorator
{
public function beforeDraw()
{
echo "size before \n";
}
public function afterDraw()
{
echo "size after \n";
}
}
$canvas = new Danvas;
$canvas->init();
$canvas->addDecorator(new ColorDrawDecorator);
$canvas->addDecorator(new SizeDrawDecorator);
$canvas->rect(4,6,7,8);