Ups !
, pasé por alto la independencia entre el Decorador y el Decorado, tienes razón.
Tal vez lo apropiado sea que las clases formatters, reciban como parámetro el objeto String_Writer, entonces la clase String_Formatter quedaría así:
Código:
abstract class String_Formatter{
public abstract function format(String_Writer obj);
}
Y cada formatter, luego de hacer su trabajo como corresponda:
Código:
class String_Formatter_Uppercase extends String_Formatter {
public function __construct() {
}
public function format(String_Writer $obj) {
$obj->setString( strtoupper($obj->getString()) );
}
}
De esa manera la pagina de prueba quedaría reducida a esto:
Código:
$string = 'php rof snrettap';
$path = 'prueba.txt';
/** Mantenemos el codigo original del sistema anterior */
$stringWriter = new String_Writer($path);
$stringWriter->setString($string);
/** Y le aplicamos el formato */
$stringUppercase = new String_Formatter_Uppercase();
$stringUppercase->format($stringWriter);
/** El objeto $stringWriter puede continuar con su vida..... */
$stringWriter->store();
print $stringWriter->getString();
Es que aún no me convence la estructura del ejemplo original (a excepción del interface que es lo que le agregaría a mi variante)