Introducción: Operaciones externas
Visitor permite añadir operaciones a estructuras sin modificar sus clases. Es ideal cuando tienes una jerarquía estable y necesitas agregar nuevas operaciones con frecuencia.
La lógica se mueve fuera de las clases base, manteniendo el modelo limpio y abierto a extensiones.

Prompt: Visitor icon exploring a museum, minimal flat style.
1. Naturaleza: Observadores expertos
Un biólogo puede analizar el mismo ecosistema y obtener conclusiones distintas sin cambiar el ecosistema.
Cada experto aplica su “visita” con criterios propios, igual que un Visitor agrega una nueva operación sin tocar los elementos.

Prompt: Scientist observing forest, soft light, documentary style.
2. Mundo Real: Auditorías
Una auditoría recorre objetos (facturas, pedidos) y aplica reglas sin cambiar su implementación.
El modelo de datos se mantiene intacto y las nuevas auditorías se agregan como visitantes independientes.

Prompt: Checklist and documents, clean office style.
3. Implementación en C#: Código Paso a Paso
public interface IVisitor { void Visitar(Documento d); }
public interface IElemento { void Aceptar(IVisitor v); }
public class Documento : IElemento
{
public string Nombre { get; set; }
public void Aceptar(IVisitor v) => v.Visitar(this);
}
public class VisitorImpresion : IVisitor
{
public void Visitar(Documento d) => Console.WriteLine($"Imprimiendo {d.Nombre}");
}
4. Visitor vs Strategy
Strategy cambia algoritmos en un contexto. Visitor aplica operaciones a una estructura completa.
Si necesitas añadir nuevas operaciones sobre muchas clases, Visitor es más adecuado.
5. Diagrama UML

Prompt: UML diagram of Visitor pattern, clean vector layout.

Prompt: Visitor traversal diagram, minimal infographic style.
⚠️ Cuándo NO Usar Visitor
- Si la estructura cambia constantemente (añadir nuevos elementos es costoso).
- Si el costo de modificar todas las clases con
acceptno se justifica.
💪 Ejercicio
Crea un visitor que calcule el costo total de distintos tipos de productos.
Conclusión
Visitor es ideal cuando necesitas añadir operaciones sin tocar estructuras existentes. Es potente cuando las operaciones cambian más que la estructura.