书中用打扮的代码阐释了这样情况下的写法:
// 人
class Person
{
private $name;
function __construct($name)
{
$this->name = $name;
}
public function show()
{
echo "打扮".$this->name."\n";
}
}
// 服饰类
class Finery
{
protected $person;
public function decorate($person)
{
$this->person = $person;
}
public function show()
{
if ($this->person != null)
{
$this->person->show();
}
}
// 具体服饰类
class TShirts extends Finery
{
public function show()
{
echo "大T恤\n";
parent::show();
}
}
class BigTrouser extends Finery
{
public function show()
{
echo "跨裤\n";
parent::show();
}
}
class Sneakers extends Finery
{
public function show()
{
echo "破球鞋\n";
parent::show();
}
}
class Suit extends Finery
{
public function show()
parent::show();
}
}
class Tie extends Finery
{
public function show()
{
echo "领带\n";
parent::show();
}
}
class LeatherShoes extends Finery
{
public function show()
{
echo "跨裤\n";
parent::show();
}
}
// 客户端代码
$person = new Person("alex");
$sneakers = new Sneakers();
$bigTrouser = new BigTrouser();
$tShirts = new TShirts();
$sneakers->decorate($person);
$bigTrouser->decorate($sneakers);
$tShirts->show();
总结
装饰模式是为已有功能动态的添加更多功能的一种方式。
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新的代码通常装饰了原有类的核心职责或主要行为。
装饰模式的优点就是把类中的装饰功能从类中搬移去除,这样可以简化原有的类。
有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中的重复的装饰逻辑。
下一章: