<?php
/**
* 装饰模式
*/
class Art{
protected $cotent = null;
public function __construct($cotent){
$this->cotent = $cotent;
}
public function decorate(){
return $this->cotent;
}
}
class ArtDec extends Art{
protected $art = null;
public function __construct($art){
$this->art = $art;
}
public function decorate(){
}
}
class SeoArt extends ArtDec{
public function decorate(){
return $this->art->decorate().'seo keyword';
}
}
class AdArt extends ArtDec{
public function decorate(){
return $this->art->decorate().'广告';
}
}
$art = new Art('这是一篇文章');
$art = new SeoArt($art);
$art = new AdArt($art);
echo $art->decorate();
$seo = new Art('这是一篇seo文章');
$seo = new SeoArt($seo);
echo $seo->decorate();
$zz = new Art('这是一篇ad文章');
$zz = new AdArt($zz);
echo $zz->decorate();
- 从代码中可以看出,我们是一直对具体的那个art对象来进行包装
- 再往下的话其实我们是对他的decorate()这个方法包装了两次,每次都是在前一次的基础上加了一点点东西
- 不要纠结于SeoArt和AdArt装饰器上的added属性和方法,他们只是GoF类图中用以区别这两个装饰器不是同一个东西,每个装饰器都可以干很多别的事,art对象也不一定只有decorate()这一个方法,我们可以选择性的去装饰对象中的全部或者部分方法
可以选择叠加用,也可以各自用。
感谢分享:十八哥 mp.weixin.qq.com/s?__biz=MzI…