Ver Mensaje Individual
  #3 (permalink)  
Antiguo 14/02/2007, 16:02
Avatar de Felippe
Felippe
 
Fecha de Ingreso: octubre-2006
Mensajes: 54
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Decorator Pattern in PHP5

Hola zsamer:

Me intereso tu ejemplo, y tienes razon en la corrección que hiciste, debia pasarse el objeto '$stringFormatter' a los formatters.

Si me permites una observación o una variante a este ejemplo, podría ser:

- Hacer que la clase 'String_Formatter' extienda de la clase 'String_Writer'.
- Definir la clase 'String_Formatter' como abstracta, definiendo el método 'format' como método abstracto.
- Hacer que las clases formatters, extiendan solamente de 'String_Formatter', implementando el método 'format' a su modo.

Te muestro un ejemplo de lo que digo solamente para la clase 'String_Formatter_Uppercase':
Código:
abstract class String_Formatter extends String_Writer{
 
   //private $string = '';
 
   /*
    public function __construct(String_Writer $writer) {
        $this->string = $writer->getString();
    }
	 
    public function getString() {
        return $this->string;
    }
 
    public function setString($string) {
        $this->string = $string;
    }
 
    public function output() {
        return $this->string;
    }
   */
   public abstract function format();
}

/** Clase formatter UpperCase */
class String_Formatter_Uppercase extends String_Formatter /*implements iString_Formatter*/ {
 
    //private $stringFormatter;
 
    /*
    public function __construct(String_Formatter $stringFormatter) {
        $this->stringFormatter = $stringFormatter;
    }
   */
 
    public function __construct($path) {
        parent::__construct($path);
    }
	
    public function format() {
		$this->setString( strtoupper($this->getString()) );
    }
 
}

/** Pagina index.php */
require('String_Writer.class.php');
require('String_Formatter.class.php');
require('String_Formatter_Uppercase.class.php');
 
$string = 'php rof snrettap';
$path = 'h:/xampp/htdocs/decorador/prueba.txt';

/** Definir la clase formatter */
$stringUppercase = new String_Formatter_Uppercase($path);
/** Pasar el valor */
$stringUppercase->setString($string);
/** Darle el formato */
$stringUppercase->format();
/** Almacenarlo */
$stringUppercase->store();
/** Mostrar resultado */
print $stringUppercase->getString();
Deje comentado el código que puede ahorrarse y las negritas muestran los cambios.

Ademas, en la pagina index.php (así le llame a la pagina de prueba) evitamos hacer demasiadas instanciaciones (tal vez innecesarias, al menos yo la veo mas limpia).

Esto lo hice al ver que en el ejemplo original, define una estructura no aprovechada, al recibir como parámetro un objeto de tipo 'String_Formatter' y al mismo tiempo hereda de él (eso me confundio un poco al principio).

Si hay alguna observación, estoy abierto a críticas o sugerencias.

Un saludo, un gusto tratar este tema.