php设计模式之装饰器模式

装饰器模式

允许向一个已有的对象动态添加新的功能,又不改变其结构,使用子类继承的方法去实现添加新功能,会不可避免的出现子类过多,继承链很长额情况.

目录结构

|decorator  #项目根目录
|--Think  #核心类库
|----Loder.php  #自动加载类
|----decorator.php  #装饰器接口
|----colorDecorator.php  #颜色装饰器
|----sizeDecorator.php  #字体大小装饰器
|----echoText.php  #被装饰者
|--index.php #单一的入口文件

代码实践

装饰器接口 Think/decorator.php

颜色装饰器 Think/colorDecorator.php

color = $color;
    }

    public function beforeDraw() {
        echo "color decorator :{$this->color}\n";
    }

    public function afterDraw() {
        echo "end color decorator\n";
    }
}

字体大小装饰器 Think/sizeDecorator.php

size = $size;
    }

    public function beforeDraw() {
        echo "size decorator {$this->size}\n";
    }

    public function afterDraw() {
        echo "end size decorator\n";
    }
}

被装饰者 Think/echoText.php

before();
        echo "你好,我是装饰器\n";
        //执行装饰器后置操作
        $this->after();
    }

    public function addDecorator(Decorator $decorator) {
        $this->decorator[] = $decorator;
    }

    //执行装饰器前置操作 先进先出
    public function before() {
        foreach ($this->decorator as $decorator){
            $decorator->beforeDraw();
        }
    }

    //执行装饰器后置操作 先进后出
    public function after() {
        $decorators = array_reverse($this->decorator);
        foreach ($decorators as $decorator){
            $decorator->afterDraw();
        }
    }
}

自动加载 Think/Loder.php

入口文件index.php

addDecorator(new \Think\colorDecorator('red'));
//增加装饰器
$echo->addDecorator(new \Think\sizeDecorator('12'));
//装饰方法
$echo->index();

上一篇 php设计模式之观察者模式
下一篇 php设计模式之建造者模式

你可能感兴趣的:(php设计模式之装饰器模式)