Home » Code » 常见设计模式之——装饰器(修饰)模式

常见设计模式之——装饰器(修饰)模式

装饰器模式,也称修饰模式,网络评语:动态的给一个对象添加一些额外的职责,就扩展功能而言比生成子类方式更为灵活。看官方术语或许云里雾里,下面看一个具体例子。

假如一篇文章报道要发表,要经过如下几步。首先,前方记者写了基本的一篇文章,编辑部的小编先看一眼,给文章加上摘要。接着主编要审查,看有没有问题,最后再给总编过目,最后交给网站打字员将文章录入最后发表。这么一个过程,最初的基本文章被一层层“装饰”,最终才得以发布。这里只是举例而已,实际的“装饰”工作或许很多且复杂,并不是这里的领导审查、过目一下。下面用装饰器模式解决这个问题。

首先定义一个基本的文章类,除了基本的内容属性,还有个article属性,方便子类存储要装饰的内容——也就是被装饰到一定程度的文章。还有个方法返回文章内容。

class BaseArticle
{
	protected $content;
	protected $article;//文章,子类通过它获取之前的内容,进行修饰
	public function __construct($content)
	{
		$this->content = $content;
	}
	public function getContent()
	{
		return $this->content;
	}
}

class Xiaobian extends BaseArticle
{
	public function __construct(BaseArticle $article)
	{
		$this->article  = $article;
		$this->decorator();//进行修饰
	}
	public function decorator()
	{
		$this->content = $this->article->getContent().'--小编加了摘要';
	}
}

class Zhubian extends BaseArticle
{
	public function __construct(BaseArticle $article)
	{
		$this->article  = $article;
		$this->decorator();
	}
	public function decorator()
	{
		$this->content = $this->article->getContent().'--主编已审查';
	}
}

class Zongbian extends BaseArticle
{
	public function __construct(BaseArticle $article)
	{
		$this->article  = $article;
		$this->decorator();
	}
	public function decorator()
	{
		$this->content = $this->article->getContent().'--总编已过目';
	}
}

class Daziyuan extends BaseArticle
{
	public function __construct(BaseArticle $article)
	{
		$this->article  = $article;
		$this->decorator();
	}
	public function decorator()
	{
		$this->content = $this->article->getContent().'--打字员已录入发布';
	}
}

$article = new BaseArticle('普通文章');
var_dump($article);
echo '<hr/>';
$xiaobian = new Xiaobian($article);
var_dump($xiaobian);
echo '<hr/>';
$zhubian = new Zhubian($xiaobian);
var_dump($zhubian);
echo '<hr/>';
$zongbian = new Zongbian($zhubian);
var_dump($zongbian);
echo '<hr/>';
$daziyuan = new Daziyuan($zongbian);
var_dump($daziyuan);
echo '<hr/>';

$result = $daziyuan->getContent();
echo $result;

最终输出的是:“普通文章–小编加了摘要–主编已审查–总编已过目–打字员已录入发布”。

可以看到,想要对内容做什么只需要添加一个修饰器。比如哪天来了个书记要在总编之后再审查,直接new一个书记出来接收zongbian过去就OK了。它们之间的先后顺序也是可以随便调换。这里面的猫腻主要在于,新加入一个装饰器的时候就将当前的文章对象换为前一个装饰器,确保下一个装器能通过它获得最新的被装饰过的内容,并立即进行装饰工作。或许说得还不是很对,但是看例子应该是很明白的了。

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.