terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat visitor.md
guest@codeandosimple: ~/blog/design-patterns $ cat visitor.md

Visitor Pattern_

// "La perseverancia puede transformar el fracaso en un logro extraordinario" - Matt Biondi

# 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

Estructura UML Visitor

# 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).

Ejemplo Visitor Contabilidad

# 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.