<?php interface IDecorator { public function decorate(); } abstract class Decorator implements IDecorator { protected $_toDecorate; public function __construct(IDecorator $toDecorate) { $this->_toDecorate = $toDecorate; } } class Html implements IDecorator { protected $_str; public function __construct($str) { $this->_str = $str; } public function decorate() { return $this->_str; } } class Strong extends Decorator { public function decorate() { return '<strong>'.$this->_toDecorate->decorate().'</strong>'; } } class Em extends Decorator { public function decorate() { return '<em>'.$this->_toDecorate->decorate().'</em>'; } } $html = new Html('text to decorate'); $decorate = new Strong($html); $decorated = $decorate->decorate(); echo $decorated.PHP_EOL; $decorate = new Em($html); $decorated = $decorate->decorate(); echo $decorated.PHP_EOL; $decorate = new Strong(new Em($html)); $decorated = $decorate->decorate(); echo $decorated.PHP_EOL; |