Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 25 min

Patrones de Comportamiento Avanzados

Los patrones de comportamiento avanzados abordan casos más especializados de comunicación entre objetos: Chain of Responsibility para pipelines de procesamiento, Mediator para comunicación centralizada, Visitor para operaciones sobre estructuras, y Memento para capturar y restaurar estado.

Chain of Responsibility

Chain of Responsibility pasa la request a lo largo de una cadena de handlers. Cada handler decide si procesa la request o la pasa al siguiente. Los filtros de seguridad en web (servlet filters, Spring Security filter chain) son el ejemplo más común. Desacopla el emisor de la request de sus receptores — no sabés qué handler va a procesar efectivamente.

Mediator y Visitor

Mediator centraliza la comunicación entre objetos para evitar dependencias directas. En lugar de que los objetos se comuniquen entre sí (acoplamiento M×N), todos se comunican a través del mediator (acoplamiento M+N). Air traffic control, chat rooms y los event buses son mediators. Visitor permite definir una nueva operación sobre una estructura de objetos sin cambiar las clases. Separa el algoritmo de la estructura — útil para compiladores (AST traversal) e informes sobre estructuras existentes.

Memento

Memento captura el estado interno de un objeto (sin violar encapsulación) para poder restaurarlo luego. El originator crea mementos de sí mismo; el caretaker los almacena sin inspeccionar su contenido. Undo/redo en editores de texto, snapshots de VMs y checkpoints de juegos son ejemplos. En Java, los mementos son frecuentemente objetos de valor inmutables o Records.

Puntos clave

  • Chain of Responsibility y Mediator reducen acoplamiento: el primero linealmente, el segundo centralizando la comunicación.
  • Visitor resuelve el problema de agregar operaciones a jerarquías estables sin modificarlas — a cambio, agregar tipos nuevos es costoso.
  • Memento preserva encapsulación: el caretaker guarda mementos pero no puede leer su contenido interno.

Code example

// Chain of Responsibility: pipeline de validacion
interface ValidationHandler {
  ValidationResult handle(Order order, ValidationHandler next);
}
class StockCheckHandler implements ValidationHandler {
  public ValidationResult handle(Order o, ValidationHandler next) {
    if (!stockAvailable(o)) return ValidationResult.fail("Sin stock");
    return next != null ? next.handle(o, null) : ValidationResult.ok();
  }
}