2.8. 装饰模式(Decorator)

未匹配的标注

uml

PHP

代码实现

<?php


//装饰器要实现的接口
interface ContentInterface
{
    function display($str);
}

//具体装饰器 vpn替换成理智上网
class ReplaceVpn implements  ContentInterface {
    public function display($str)
    {
        return str_replace('vpn','理智上网',$str);
    }
}

//具体装饰器 脏话替换成***
class ReplaceDirtyLanguage implements  ContentInterface {
    public function display($str)
    {
        return str_replace('草泥马','***',$str);
    }
}


//执行者角色
Class ContentDecorator
{
    protected $decorators = [];
    public function addDecorator(ContentInterface $decorator)
    {
        $this->decorators[] = $decorator;
    }

    public function handleDecorator($str) //要被装饰的类
    {
        foreach ($this->decorators as $decorator)
            $str = $decorator->display($str);
        return $str;
    }

}

$str = '需要vpn才能看神兽草泥马';  //原本字符串
$decorator = new ContentDecorator();
$decorator->addDecorator(new ReplaceVpn());  //vpn装饰器
$decorator->addDecorator(new ReplaceDirtyLanguage());  //脏话装饰器
echo $decorator->handleDecorator($str);

需求变更

  1. 去掉 脏话 的过滤:
    注释掉$decorator->addDecorator(new ReplaceDirtyLanguage());即可

  2. 内容后面要加署名
    创建一个署名具体装饰器,
    $decorator->addDecorator(new 署名具体装饰器);

执行者

装饰器没有严格的规定,有些装饰器是 执行者 角色执行所有装饰器
(也就是ContentDecorator),而有些直接调用。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~