php设计模式(八)装饰器模式

装饰器模式

  1. 动态的添加修改类功能
  2. 一个类提供了一项功能,如果要在修改并添加额外的功能,传统方案需要写一个子类继承,并重新实现类方法
  3. 使用装饰器模式,仅需要在运行时增加一个装饰器对象
// 例如修改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 = https://www.it610.com/article/$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();

    推荐阅读