七、装饰器模式
参考:http://imhuchao.com/1498.html
当前有一个功能完善的对象,如果我们想要给这个对象添加一个新的职责,那么我们可以用一个新的类去装饰它来实现对原有对象职责的扩展。
新的类称为“装饰者”,原有的对象称为“被装饰者”。这种模式被称为装饰器模式。
例子:文章编辑,基础文章需要装饰(小编给文章加摘要,seo人员添加seo关键字)
<?php
/**
* 装饰器模式,完成文章修饰功能
* 装饰器模式: 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。而不用修改原先对象或派生类
* 而我们也应该尽量使用“对象组合”,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。
* 装饰器模式的本质就是“动态组合”。动态是手段,组合才是目的。
* 总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来“动态组合”的这样一个模式。
* 在以下两种情况下可以考虑使用装饰器模式:
* (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。
* (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。
*
*/
/**
* 文章基础类
*
*/
class BaseArt{
/**
* 文章内容
* @var string
*/
protected $content;
/**
* 这是个BaseArt对象
* @var BaseArt
*/
protected $art = null;
public function __construct($contents){
$this->content = $contents;
}
public function decorator(){
return $this->content;
}
}
/**
* 装饰类
* 小编给文章加摘要
*
*/
class BianArt extends BaseArt{
public function __construct(BaseArt $art){
$this->art = $art;
$this->decorator();
}
public function decorator() {
return $this->content = $this->art->decorator(). '小编摘要<br />';
}
}
/**
* 装饰类
* seo人员添加seo关键字
*
*/
class SeoArt extends BaseArt{
public function __construct(BaseArt $art){
$this->art = $art;
$this->decorator();
}
public function decorator() {
return $this->content = $this->art->decorator(). 'seo 关键词<br />';
}
}
$bian = new BianArt(new BaseArt('文章基础内容<br />'));
echo $bian->decorator();
echo '<br />-------------------------------------------<br /><br />';
$seo = new SeoArt($bian);
echo $seo->decorator();