# Propósito
El patrón Visitor (Visitante) permite agregar nuevas operaciones sobre una estructura de objetos, sin cambiar las clases de los elementos sobre los que opera.
# Problema
Dificultad para añadir nuevas operaciones o comportamientos a estructuras de objetos complejas sin tener que modificar cada una de sus clases constituyentes.
# Solución
Externalizar las operaciones en un objeto “Visitor“. Las clases originales aceptan al visitante y le delegan la ejecución, manteniendo las clases base limpias y enfocadas.
# Estructura
# Participantes
- Visitor (Interface): Define visitas para cada elemento concreto.
- ConcreteVisitor: Implementa la lógica específica de la operación.
- Element (Interface): Define el método accept().
- ConcreteElement: El objeto que es visitado.
# Cuándo Usarlo
En sistemas con estructuras de datos estables pero donde las operaciones sobre ellas cambian o crecen frecuentemente.
# Ventajas
-
verified
Flexibilidad: Nuevas operaciones sin tocar código antiguo.
-
verified
Cohesión: Agrupa operaciones relacionadas en un solo lugar.
# Desventajas
-
warning
Acoplamiento: Los visitantes están muy atados a la jerarquía de elementos.
-
warning
Encapsulamiento: A menudo requiere exponer campos privados para funcionar.
# Ejemplo: Contabilidad
Generación de diferentes tipos de reportes financieros (Visitor) recorriendo el listado de cuentas (Elements).
# Código Java
interface Account { void accept(Visitor v); }
class SavingsAccount implements Account {
double balance;
public void accept(Visitor v) { v.visit(this); }
}
class ReportVisitor implements Visitor {
public void visit(SavingsAccount s) { total += s.balance; }
}
# Mapeo Participantes
- Account: Element.
- AccountVisitor: Visitor Interface.
- SavingsAccount/LoanAccount: ConcreteElements.
- FinancialReportVisitor: ConcreteVisitor.
# Conclusiones
Solución poderosa para arquitecturas basadas en datos donde se necesita una gran variedad de analíticas u operaciones externas sobre objetos estables.
# Patrones relacionados
Composite
Visitor puede recorrer estructuras jerárquicas de tipo Composite.
Interpreter
Se usa a menudo para recorrer el árbol sintáctico e interpretar el lenguaje.