viernes, 22 de abril de 2016

Patrón Visitor

Objetivo:
“Construye una operación que debe realizarse sobre los elementos de un conjunto de objetos. Esto permite agregar nuevas operaciones sin modificar las clases de estos objetos. ”

¿Cuándo utilizar visitor?
Las situaciones óptimas en los que se debe utilizar este patrón serán:
  • Una estructura de objetos contiene muchas clases de objetos con distintas interfaces y se desea llevar a cabo operaciones sobre estos objetos que son distintas en cada clase concreta.
  • Se quieren llevar a cabo muchas operaciones dispares sobre objetos de una estructura de objetos sin tener que incluir dichas operaciones en las clases.
  • Las clases que definen la estructura de objetos no cambian, pero las operaciones que se llevan a cabo sobre ellas sí. 
Diagrama de Clases Genérico

Ejemplo
Descargar proyecto Aquí
En la tienda X todos los productos pagan IVA. Algunos productos poseen un descuento. Utilizaremos el Visitor para solucionar este problema

Diagrama UML del Elemento

Comenzaremos codificando la clase abstracta Visitable, que en nuestro ejemplo estará representada por el Producto.


Seguidamente codificamos lo tipos de productos por medio de las clases ProductoDescuento y ProductoNormal que harán las veces de ElementoConcreto1 y ElementoConcreto2


Diagrama UML del Visitante
Continuamos codificando la Interfaz que estaría representada por la clase Visitante, La interfaz IVisitante incluye la firma de los dos métodos, uno por cada clase que tenga que ser visitada, es decir se le pasa por parámetro el ElementoConcreto correspondiente.

Ahora codificamos el visitante concreto que en este caso será IVA.


Diagrama UML Completo
Finalmente instanciamos los objetos necesarios para la implementación del Patrón Visitor.

Ventajas
  •   Permite agregar numerosas funcionalidades a un conjunto de clases sin volverlas pesadas.
  •     Permite agregarles funcionalidades a un conjunto de clases sin modificar su interfaz.

Desventaja
Si la estructura del conjunto de clases a las que es necesario agregar funcionalidades cambia a menudo, el patrón Visitor no se adapta bien, puesto que cualquier modificación de la estructura implica una modificación de cada visitante

2 comentarios: