装璜器模式
- 动静的增加批改类性能
- 一个类提供了一项性能,如果要在批改并增加额定的性能,传统计划须要写一个子类继承,并从新实现类办法
- 应用装璜器模式,仅须要在运行时减少一个装璜器对象
// 例如批改Canvas的draw办法class Canvas { private $data; private $decorators; // 用于保留所有装璜器 public function init($hei,$wid){ for($i=0;$i<$hei;$i++){ for($i=0;$i<$wid;$i++){ $data[$i][$j] = "*"; } } $this->data = $data; } public function rect($a1,$a2,$b1,$b2) { foreach($this->data as $k1->$line){ if($k1<$a1 or $k1 > $a2) continue; foreach($line as $k2 => $item){ if($k2<$b2 or $k2> $b2) contine; $this->data[$k1][$2] = ' '; } } } public function draw(){ foreach ($this->data as $line){ foreach ($lien as $item) { echo $item; } echo PHP_EOL: } } // 用于减少装璜器 public function addDecorator(Decorator $decorator){ $this->decorators[] = $decorator; } // 前置执行 public function before(){ foreach($this->decorators as $decorator) { $decorator->before(); } } public function after(){ $decorators = array_reserse($this->decorator); foreach($decorators as $decorator) { $decorator->before(); } }}// 装璜器接口 在某个办法之前,之后退出额定操作interface Decorator { public function beforDraw(); public function afterDraw();}class ColorDecorator implements Decorator { private $color; public function __construct($color){ $this->color = $color; } public function before(){ echo 'before'.$this->color; } public function after(){ echo 'after'; }}$c = new Canvas();$c->addDecorator(new ColorDecorator('red')); // 减少不同的装璜器,进行不同的批改$c->rect(1,6,2,12);$c->draw();