CleverCode最近在看备装饰模式。
1 模式介绍 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
2 模式中的角色 (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
3 模式结构
4 项目应用
4.1 设计一个装饰人服饰
4.2 源码设计
/**
* php 装饰模式
* copyrigh (c) http://blog.csdn.net/CleverCode
*
*/
class Person
{/*{{{*/
public $name;
public function __construct($name = '')
{
$this->name = $name;
}
public function show()
{
echo "装扮的{$this->name}\r\n";
}
}/*}}}*/
//服饰类
class Finery extends Person
{/*{{{*/
protected $componet;
public function decorate(Person $componet)
{
$this->componet = $componet;
}
public function show()
{
if($this->componet)
{
$this->componet->show();
}
}
}/*}}}*/
//具体服饰
class Tshirts extends Finery
{/*{{{*/
public function show()
{
echo "大Tshirts\r\n";
parent::show();
}
}/*}}}*/
class BigTtouser extends Finery
{/*{{{*/
public function show()
{
echo "垮裤\r\n";
parent::show();
}
}/*}}}*/
class Clinet
{/*{{{*/
public static function main($argv)
{
$person = new Person('CleverCode');
$tshirts = new Tshirts();
$bigTtouser = new BigTtouser();
$tshirts->decorate($person);
$bigTtouser->decorate($tshirts);
$bigTtouser->show();
}
}/*}}}*/
Clinet::main($argv);
?>
4.3 结果展示