domingo, junio 17, 2007

Composite Pattern, un poco de código y poca explicación

Hoy con un poco de tiempo (exactamente media hora de "ocio") me dispuse a leer algunos de los blogs que tengo en los favoritos y llego al Blog de Alejo y veo el diagrama que esta aquí a la derecha y veo que es el diagrama del patrón Composite. De inmediato me dirijo a Google y encuentro información sobre Composite en Wikipedia y con ayuda del código que aparece en la versión en ingles del articulo de Composite logro entenderlo y aplicarlo en un pequeño ejemplo que dejo a continuación.

abstract class Grafico{
abstract public function
dibujar();
}

class
Triangulo extends Grafico{
private
$nombre = '';

public function
__construct($nombre = 'unknown'){
$this->nombre = $nombre;
}

public function
dibujar(){
echo
'-Soy triagulo '.$this->nombre.'.<br>';
}
}

class
Contenedor extends Grafico{
private
$nombre = '';
private
$contenedor = array();

public function
__construct($nombre = 'unknown'){
$this->nombre = $nombre;
}

public function
dibujar(){
echo
'Soy contenedror '.$this->nombre.'.<br>';
foreach(
$this->contenedor as $grafico)
$grafico->dibujar();
}

public function
add(Grafico $grafico){
$this->contenedor[] = $grafico;
}

public function
del(Grafico $grafico){
unset(
$this->contenedor[$grafico]);
}
}

$tri1 = new Triangulo('1');
$tri2 = new Triangulo('2');
$tri3 = new Triangulo('3');

$contenedor1 = new Contenedor('1');
$contenedor2 = new Contenedor('2');
$contenedor3 = new Contenedor('3');

$contenedor1->add($tri1);
$contenedor1->add($tri2);
$contenedor2->add($tri3);

$contenedor3->add($contenedor1);
$contenedor3->add($contenedor2);

$contenedor3->dibujar();

Si ejecutamos lo anterior devuelve lo siguiente:
Soy contenedror 3.
Soy contenedror 1.
-Soy triagulo 1.
-Soy triagulo 2.
Soy contenedror 2.
-Soy triagulo 3.

Saludos. Dario Ocles.