php 设计模式之 装饰器(Decorator)



1. 装饰器模式

动态地给一个对象添加新的功能,同时又不改变其结构,进行内容扩展

就增加功能来说,Decorator模式相比生成子类更为灵活

参考链接


2. 实列

根据新老用户发送不同的短信模板

interface Template {
    public function message();
}

// 假设有很多模板实现了上面的短信模板接口
// 下面这个是其中一个优惠券发送的模板实现
class Coupon implements Template {
    public function message() {
        return '优惠券信息:我们是全国第一的牛X产品哦,送您十张优惠券!';
    }
}

// 我们来准备好装饰上面那个过时的短信模板
abstract class DecoratorTemplate implements Template {
    public $template;
    public function __construct($template) {
        $this->template = $template;
    }
}

// 过滤新广告法中不允许出现的词汇
class newMessage extends DecoratorTemplate {
    public function message() {
        return str_replace('全国第一', '全国第二', $this->template->message());
    }
}

// 客户端,发送接口,需要使用模板来进行短信发送
class Message {
    public $msgType = 'old';
    public function send(Template $mt) {
        // 发送出去咯
        if ($this->msgType == 'old') {
            echo '面向内网用户发送' . $mt->message() . PHP_EOL;
        } else if ($this->msgType == 'new') {
            echo '面向全网用户发送' . $mt->message() . PHP_EOL;
        }

    }
}

$template = new Coupon();
$message = new Message();

// 老系统,用不着过滤,只有内部用户才看得到
$message->send($template);

// 新系统,面向全网发布的,需要过滤一下内容哦
$message->msgType = 'new';
$template = new newMessage($template);

// 过滤完了,发送吧
$message->send($template);

3. 使用场景

  1. Laravel框架中的中间件 middleware 使用装饰器模式
posted @ 2020-12-28 16:54  linsonga  阅读(90)  评论(0)    收藏  举报