美文网首页
php设计模式(八)装饰器模式

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

作者: mafa1993 | 来源:发表于2022-07-05 20:25 被阅读0次

    装饰器模式

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

    相关文章

      网友评论

          本文标题:php设计模式(八)装饰器模式

          本文链接:https://www.haomeiwen.com/subject/ghnybrtx.html