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. 使用场景
- Laravel框架中的中间件 middleware 使用装饰器模式

浙公网安备 33010602011771号