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