Design pattern decorator

<?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;