23 octubre 2005

El patrón composite

Aprovechando el tema de las interfaces y su ejemplo, el de sacar la salida por impresora, pantalla o base de datos, voy a contar un poco en qué consiste el patrón de diseño compuesto (o "composite").

Supongamos que el gracioso que mencionabamos en las interfaces, nos pide poder sacar en la pantalla y en la impresora a la vez. Una solución es hacerse una clase PantallaEImpresora que implemente Escritor y escriba en pantalla y en impresora.

Sin embargo, hay una solución mejor. Hacer la clase PantallaEImpresora tiene la pega tonta de que necesitamos repetir el código de nuestra clase Pantalla y de nuestra clase Impresora. En nuestro tonto ejemplo, el código es tonto y no se pierde mucho tiempo en repetirlo, pero en un programa serio, seguramente no se hace tan rápido. Además, ¿por qué reptetir el código que ya tenemos hecho, en contra de la filosofía de reutilización?.

Una solución mejor es hacerse una clase "compuesto". Esta clase guarda dentro una lista de Escritores y a su vez implementa la interface Escritor. En el método escribe(), lo que hace es ir llamando a los métodos escribe() de todos los Escritor que tiene guardados. Por supuesto, puede tener métodos para añadir o borrar Escritores sobre la marcha.

El código puede ser parecido a este

class CompuestoEscritores implements Escritor
{

// Lista de escritores
private LinkedList escritores = new LinkedList();

// Añade un escritor a la lista
public void addEscritor (Escritor escritor)
{
escritores.add(escritor);
}

// LLama al escribe() de todos los escritores
public void escribe (String cadena)
{
for (int i=0;i<escritores.size();i++)
{
((Escritor)escritores.get(i)).escribe(cadena);
}
}
}

Con esta clase tan tonta, podemos permitir que nuestro código anterior sea capaz de sacar los resultados en varios sitios a la vez, eligiendo qué sitios. Además, si inventamos un nuevo sitios (por ejemplo, enviar los resultados por red) bastará como antes hacer la clase Escritor correspondiente y podemos añadirla tanto aquí como a nuestro método de cálculos.

Una pequeña tontería, el código de CompuestoEscritores lo acabo de poner sobre la marcha, igual ni siquiera compila....

No hay comentarios: