martes, 4 de diciembre de 2012

Patrón de diseño Composite.

Es un patrón de diseño estructural. Permite construir objetos complejos a partir de otros objetos, componiendo una estructura de árbol. Podemos manipular los objetos contenidos en el árbol de forma uniforme.

Cliente: maneja los objetos que forman parte del compuesto como componentes.

Componente (o component en inglés): clase abstracta de la que heredan todas las demás. Declara una interfaz de todos los objetos de la composición. Declara una interfaz de acceso y manipulación de los componentes hijo. Opcionalmente define una interfaz para acceder al padre de cada componente.

Compuesto o composite: define e implementa las operaciones de manejo de los hijos. Almacena a los hijos. Los objetos compuestos tratan a los objetos que contienen como instancias de tipo Componente.

Hoja (leaf): nodo hoja del árbol de objetos obtenido a partir de la estructura de clases. No tiene hijos y define el comportamiento de los objetos primitivos.

Existen dos versiones del patrón composite: transparente y seguro.

El diagrama anterior muestra la estructura de un Composite transparente. Como se puede ver las operaciones básicas están en el componente, que son heredadas por hoja y compuesto. El problema viene cuando hoja hereda operaciones que no debería manejar. Hoja no debe añadir o borrar nodos. Para solventar este problema se puede mostrar un mensaje o lanzar una excepción cuando hagamos hoja.add(componente); . 

Código del patrón composite transparente: Composite Transparente


En el composite seguro, la hoja no puede realizar operaciones que no son propias de ellas.

Código del patrón composite seguro: Composite Seguro

Debemos hacer un downcast de Componente a Compuesto.

Componente root = new Compuesto("Raiz");
Componente nodo1 = (Compuesto) new Compuesto("Nodo1");
Componente nodo2 = new Compuesto("Nodo2");
Componente nodo3 = new Compuesto("Nodo3");
Componente hoja1 = new Hoja("Hoja1");
Componente hoja2 = new Hoja("Hoja2");
Componente hoja3 = new Hoja("Hoja3");
        
//Tenemos que hacer downcast.
((Compuesto)root).add(hoja1);
((Compuesto)root).add(nodo1);
((Compuesto)nodo1).add(hoja2);
((Compuesto)nodo1).add(hoja3);
((Compuesto)nodo1).add(nodo2);
//((Compuesto)hoja1).add(hoja2); //Operación no permitida
((Compuesto)root).mostrar(1);

Podemos hacer ((Compuesto)hoja1).add(hoja2) pero como el downcast es manual debemos tener cuidado a qué objetos se lo aplicamos (recordar explicación downcast en Introducción a PPO con java.html). Podemos (compila) hacer downcast de hoja, declarada como Componente a Compuesto, pero no debemos porque JAVA lanzará una excepción ClassCastException.

No hay comentarios:

Publicar un comentario