当前位置: 首页 > 后端技术 > PHP

PHP设计模式(八)装饰者模式

时间:2023-03-29 20:58:05 PHP

装饰者模式动态添加和修改类函数。一个类提供一个功能。如果要修改和增加额外的功能,传统方案需要写一个子类继承,重新实现类方法。使用装饰器模式,只需要运行添加装饰器对象时//例如修改Canvas类的draw方法Canvas{private$data;私有$装饰器;//用于保存所有装饰器publicfunctioninit($hei,$wid){for($i=0;$i<$hei;$i++){for($i=0;$i<$wid;$i++){$数据[$i][$j]="*";}}$this->data=$data;}publicfunctionrect($a1,$a2,$b1,$b2){foreach($this->dataas$k1->$line){if($k1<$a1or$k1>$a2)继续;foreach($lineas$k2=>$item){if($k2<$b2or$k2>$b2)继续;$this->data[$k1][$2]='';}}publicfunctiondraw(){foreach($this->dataas$line){foreach($lienas$item){echo$item;}echoPHP_EOL:}}//用于添加装饰器公共乐趣动作addDecorator(Decorator$decorator){$this->decorators[]=$decorator;}//预执行公共函数before(){foreach($this->decoratorsas$decorator){$decorator->before();}}publicfunctionafter(){$decorators=array_reserse($this->decorator);foreach($decoratorsas$decorator){$decorator->before();}}}//方法中的装饰器接口在接口装饰器之前和之后添加额外的操作{publicfunctionbeforeDraw();publicfunctionafterDraw();}classColorDecoratorimplementsDecorator{private$color;公共函数__construct($color){$this->color=$color;}publicfunctionbefore(){echo'before'.$this->color;}publicfunctionafter(){echo'after';}}$c=newCanvas();$c->addDecorator(newColorDecorator('red'));//添加不同的装饰器,做不同的修饰$c->rect(1,6,2,12);$c->draw();