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

发布时间:2022-12-15 18:00

装饰器模式

  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 = $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();

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号