装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
<?php
abstract class Component
{
public abstract function Operation () ;
}
class ConcreteComponent extends Component
{
function Operation ()
{
echo '具体对象的操作<br />' ;
}
}
class Decorator extends Component
{
protected $component ;
public function SetComponent (Component $component )
{
$this ->component = $component ;
}
public function Operation ()
{
if ($this ->component != null ){
$this ->component->Operation();
}
}
}
class ConcreteDecoratorA extends Decorator
{
private $addedState ;
function Operation ()
{
parent ::Operation();
$this ->addedState = 'New State' ;
echo '具体装饰对象A的操作' ;
}
}
class ConcreteDecoratorB extends Decorator
{
private $addedState ;
function Operation ()
{
parent ::Operation();
$this ->addedBehavior();
echo '具体装饰对象B的操作' ;
}
private function addedBehavior ()
{
}
}
$c = new ConcreteComponent();
$d1 = new ConcreteDecoratorA();
$d2 = new ConcreteDecoratorB();
$d1 ->SetComponent($c );
$d2 ->SetComponent($d1 );
$d1 ->Operation();
echo '<br />' ;
echo '<br />' ;
$d2 ->Operation();
因为装饰模式对象作为子对象的包装,所以保持基类中的方法尽可能少是很重要的。如果一个基类具有大量特性,那么装饰对象不得不为他们包装的对象的所有public方法加上委托。