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