abstract class Component {
public abstract function operation();
}
class ConcreteComponent extends Component {
public function operation() {
echo '具体对象的操作<br/>';
}
}
abstract class Decorator extends Component {
protected $component;
public function setComponent(Component $component) {
//设置Component
$this->component = $component;
}
public function operation() {
//重写Operation(),实际执行的是Component的Operation()
if($this->component != null) {
$this->component->operation();
}
}
}
class ConcreteDecoratorA extends Decorator {
//本类的独有功能,区别于ConcreteDecoratorB
private $addedState;
public function operation() {
//首先运行原Component的Operation(),再执行本类的功能,如 addState,相当于对原Component进行了装饰
parent::operation();
$this->addedState = 'New State';
echo '具体装饰对象A的操作<br/>';
}
}
class ConcreteDecoratorB extends Decorator {
public function operation() {
//首先运行原Component的Operation(),再执行本类的功能,如 AddedBehavior(),相当于对原Component进行了装饰
parent::operation();
$this->addedBehavior();
echo '具体装饰对象B的操作<br/>';
}
//本类的独有方法,区别于ConcreteDecorator
private function addedBehavior() {
}
}
//装饰的方法是:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c,在用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation()
$c = new ConCreteComponent();
$d1 = new ConcreteDecoratorA();
$d2 = new ConcreteDecoratorB();
$d1->setComponent($c);
$d2->setComPonent($d1);
$d2->operation();