Mi granito de java: Visitor

lunes, 13 de junio de 2011

Visitor

Busca separar un algoritmo de la estructura de un objeto. La operación se implementa de forma que no se modifique el código de las clases sobre las que opera.
Si un objeto es el responsable de mantener un cierto tipo de información, entonces es lógico asignarle también la responsabilidad de realizar todas las operaciones necesarias sobre esa información. La operación se define en cada una de las clases que representan los posibles tipos sobre los que se aplica dicha operación, y por medio del polimorfismo y la vinculación dinámica se elige en tiempo de ejecución qué versión de la operación se debe ejecutar. De esta forma se evita un análisis de casos sobre el tipo del parámetro.

Este patrón debe utilizarse cuando.
  • 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.
Dado que este patrón separa un algoritmo de la estructura de un objeto, es ampliamente utilizado en intérpretes, compiladores y procesadores de lenguajes, en general.
Se debe utilizar este patrón si se quiere realizar un cierto número de operaciones, que no están relacionadas entre sí, sobre instancias de un conjunto de clases, y no se quiere “contaminar” a dichas clases.

Diagrama UML


Visitor: declara una operación de visita para cada uno de los elementos concretos de la estructura de objetos. Esto es, el método visit().
VisitorConcreto : implementa cada una de las operaciones declaradas por Visitor.
Element: define la operación que le permite aceptar la visita de un Visitor.
ConcreteElement: implementa el método accept() que se limita a invocar su correspondiente método del Visitor.
ObjectStructure: gestiona la estructura de objetos y puede ofrecer una interfaz de alto nivel para permitir a los Visitor visitar a sus elementos.

El Element ejecuta el método de visitar y se pasa a sí mismo como parámetro.

Ejemplo

En Argentina todos los productos pagan IVA. Algunos productos poseen una tasa reducida. Utilizaremos el Visitor para solucionar este problema.







 Consecuencias
  • Facilita la inclusión de nuevas operaciones.
  • Agrupa las operaciones relacionadas entre sí.
  • La inclusión de nuevos ElementsConcretos es una operación costosa.
  • Posibilita visitar distintas jerarquías de objetos u objetos no relacionados por un padre común.

2 comentarios:

luis fernández liesa dijo...

gracias...me ayudo a comprender el visitor

Unknown dijo...

Excelente ejemplo, te agradezco mucho.