php设计模式之装饰器模式
php设计模式之装饰器模式
别人说我名字很长 发表于2年前
php设计模式之装饰器模式
  • 发表于 2年前
  • 阅读 19
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

<?php

namespace Tools;

    /*
    装饰器模式
    装饰器模式(decorator),可以动态的添加修改类的功能
    一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法
    使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
    */

//装饰器接口
interface Decorator{
    public function before();
    public function after();
}

//颜色的装饰器
class ColorDecorator implements \Tools\Decorator{
    private $color;
    public function __construct($color="chocolate")
    {
        $this->color = $color;
    }

    public function before(){
        return "<div style=\"background-color: {$this->color};\">";
    }

    public function after(){
        return '</div>';
    }
}

//字体的装饰器
class SizeDecorator implements \Tools\Decorator{
    private $size;
    public function __construct($size="16px")
    {
        $this->size = $size;
    }

    public function before(){
        return "<span style='font-size:{$this->size};'>";
    }

    public function after(){
        return '</span>';
    }
}

//使用装饰器
class draw{

    private $decorators = array();

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

    public function before(){
        foreach($this->decorators as $docorator){
            echo $docorator->before();
        }
    }

    public function after(){
        $decorators = array_reverse($this->decorators);
        foreach($decorators as $decorator){
            echo $decorator->after();
        }
    }

    public function show(){
        $this->before();
        echo '这里是内容输出';
        $this->after();
    }
}

//在运行时添加装饰器对象
$d = new \Tools\draw();
$d->addDecorator(new \Tools\ColorDecorator("#f00"));
$d->addDecorator(new \Tools\SizeDecorator("16px"));
$d->show();



共有 人打赏支持
粉丝 53
博文 227
码字总数 83765
×
别人说我名字很长
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: