Patrón Visitor

Lectura de ~3 minutos

Representa una operación a ejecutar en un elemento de una estructura de objectos. Este patrón permite definir una nueva operación sin cambiar las clases con las que se operan.

Aplicabilidad

  • Una estructura de objetos tiene una grana cantidad de clases con distintas interfaces, y se quiere operar con esos objetos y dicha operación depende de su clase concreta.

  • Se necesita implementar un gran número de operaciones distintas que no tienen relación entre ellas y no se quiere “contaminar” las clases con las que operan.

  • Las clases de los objetos de la estrcutura no suele cambiar, pero sí se suele añadir operaciones a la esctructura.

Esctructura

Visitor Diagram

Se define una interfaz con las operaciones de cada elemento de la estrcutura. Mediante polimorfismo se puede saber que operación en concreto se ejectuta, de modo que se sabrá que elemento se está ejecutando y se pord´ra acceder a ese elemento a través de su interfaz.

Se define a su vez una interfaz común a todos los elementos que recibe el visitor, y es cada hijo quien realiza la llamada a la operación correspondiente.

La estrucutra de objetos bien puede ser un listado, array o incluso una estrcutura Composite. El único requisito es que se puedan enumerar sus elementos o proveer de una interfaz que permita a este patrón visitar los elementos Iterator.

Consecuencias

  • VIsitor hace que añadir nuevas operaciones sea sencillo.

  • Visitor recoge las operaciones relacionadas y las que están separadas y no relacionadas.

  • Dificulta añadir más clases a la esctrucutra creada que se visita.

  • Permite visitar toda una esctructura independientemente de su tipado.

  • Permite acumular un estado para realizar la operación que se desea.

  • El patrón asume que el elemento en concreto de la esctrucutra tiene una interfaz que le permite acceder a la información que necesita para hacer el trabajo, lo que rompe la encapsulación de la Programación Orientada a Objetos.

Aquí un pequeño ejemplo en net core.

Nos vemos en las próximas líneas.

Escrito el 06/12/2018