Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Patrones de Diseño de Comportamiento

Visitor

Representar operación a aplicar a elementos de estructura

Universidad Nacional de Rio Negro - Sede Andina

Definición

El patrón Visitor (Visitante) es un patrón de diseño de comportamiento que permite definir una nueva operación sin cambiar las clases de los elementos sobre los que opera.

Para lograrlo, el patrón separa el algoritmo de la estructura de objetos sobre la que opera, permitiendo añadir nuevas operaciones simplemente creando nuevas clases de visitantes.

Origen e Historia

Formalizado por el GoF en 1994, el Visitor se diseñó principalmente para resolver problemas en la construcción de compiladores. Cuando se tiene un Árbol de Sintaxis Abstracta (AST), se necesitan realizar muchas operaciones diferentes sobre él (chequeo de tipos, optimización, generación de código). Añadir estos métodos a cada nodo del árbol haría que las clases de los nodos fueran gigantescas y difíciles de mantener. El Visitor permitió extraer esas lógicas a objetos externos.

Motivación

La motivación principal es cumplir con el Principio de Abierto/Cerrado. Queremos que nuestra jerarquía de objetos (la estructura) esté cerrada a modificaciones, pero abierta a nuevas funcionalidades (las operaciones).

Contexto

Cuando aplica

Cuando no aplica

Consecuencias de su uso

Positivas

Negativas

Alternativas

Estructura

Diagramas

Diagrama de Clases

Diagrama de Secuencia (Doble Despacho)

Ejemplos

/**
 * Interfaz Visitante.
 */
public interface Visitante {
    void visitar(Circulo c);
    void visitar(Rectangulo r);
}

/**
 * Interfaz Elemento.
 */
public interface Forma {
    void aceptar(Visitante v);
}

/**
 * Elementos Concretos.
 */
public class Circulo implements Forma {
    public float radio;
    @Override
    public void aceptar(Visitante v) { v.visitar(this); }
}

public class Rectangulo implements Forma {
    public float base, altura;
    @Override
    public void aceptar(Visitante v) { v.visitar(this); }
}

/**
 * Operación externa: Calcular Área.
 */
public class CalculadorArea implements Visitante {
    @Override
    public void visitar(Circulo c) {
        System.out.println("Área Círculo: " + (Math.PI * c.radio * c.radio));
    }
    
    @Override
    public void visitar(Rectangulo r) {
        System.out.println("Área Rectángulo: " + (r.base * r.altura));
    }
}

Ejercicios

Resumen

El Visitor es el patrón del “doble despacho”. Su gran poder reside en la capacidad de extender la funcionalidad de una estructura compleja sin tocar una sola línea de código de las clases originales, permitiendo que el sistema crezca de forma modular y manteniendo las responsabilidades de procesamiento bien aisladas de las de representación.

Próximo paso

Para seguir, conviene pasar a el material siguiente, donde el recorrido continúa sobre esta base.