Once patrones en once lecciones: la familia más numerosa del catálogo, y también la más confundible — media docena de sus miembros comparten diagrama y se distinguen solo por la intención. Esta lección es el mapa final del módulo: la tabla completa, los cinco careos que resuelven el 90% de las dudas reales, un flowchart de decisión, las combinaciones que trabajan en equipo, y el repaso de qué quedó instalado en cada rincón de PideYa. Al terminarla, el catálogo GoF entero —creacionales, estructurales y de comportamiento— estará en tu caja de herramientas.
Contenido
- La tabla de los once
- Los pares que se confunden, frente a frente
- Guía de decisión
- Combinaciones frecuentes
- El módulo 4 en el mapa de PideYa
- Ejercicios y conclusión
- Cierre: el catálogo está completo
La tabla de los once
| Patrón | Reifica... | Pregunta que responde | En PideYa |
|---|---|---|---|
| Chain of Responsibility | El camino de una petición | ¿Quién de estos debe atender esto? | ManejadorPedido: fraude → zona → stock → mínimo |
| Command | Una petición | ¿Cómo encolo, registro o deshago una acción? | Comando del panel: aceptar, cancelar, macro |
| Interpreter | Frases de un lenguaje | ¿Cómo evalúo reglas escritas como texto? | ExpresionRegla: "total > 30 Y dia == VIERNES" |
| Iterator | Un recorrido | ¿Cómo recorro esto sin conocer sus tripas? | IteradorProfundidadCarta, historial paginado |
| Mediator | Un protocolo de coordinación | ¿Cómo colaboran muchos sin conocerse? | CentralReparto: cocina ↔ repartidores |
| Memento | Una instantánea de estado | ¿Cómo guardo y restauro sin exponer? | Carrito.Memento, puntos de restauración de la carta |
| Observer | Una suscripción | ¿Cómo se enteran muchos de que uno cambió? | ObservadorPedido: cliente, repartidor, cocina, estadísticas |
| State | Una etapa del ciclo de vida | ¿Qué puedo hacer ahora mismo? | EstadoPedido: CREADO → ... → ENTREGADO |
| Strategy | Un algoritmo | ¿De cuál de estas maneras lo hago? | CalculoEnvio, EstrategiaAsignacion |
| Template Method | El esqueleto de un algoritmo | ¿Cómo fijo el flujo y varío pasos? | InformeCierre: cargar → agregar → formatear → distribuir |
| Visitor | Una operación sobre una estructura | ¿Cómo añado operaciones sin tocar los nodos? | VisitanteCarta: exportar, alérgenos, auditoría |
La columna "reifica" no es adorno: es el resumen del módulo. Los once aplican el mismo movimiento —convertir en objeto un aspecto de la conducta— y se distinguen por qué convierten.
Los pares que se confunden, frente a frente
State vs. Strategy
Gemelos estructurales (contexto que delega en una interfaz con variantes); intención opuesta:
| State | Strategy | |
|---|---|---|
| Quién cambia el objeto delegado | Los propios estados, al transitar | El exterior (config, cliente), cuando quiere |
| ¿Las variantes se conocen entre sí? | Sí: cada estado sabe a cuáles se va | No: cada estrategia ignora a sus hermanas |
| Hay grafo de transiciones | Sí (dibuja el stateDiagram) | No: ningún cálculo "transita" a otro |
Prueba del algodón: si el objeto delegado se sustituye a sí mismo desde dentro, es State; si lo eligen desde fuera y las variantes no forman ciclo de vida, es Strategy.
Command vs. Strategy
Ambos encapsulan "código en un objeto":
| Command | Strategy | |
|---|---|---|
| Encapsula | Que se pidió algo: la llamada con sus argumentos y receiver | Cómo se hace algo: el algoritmo, sin petición concreta |
| Vida típica | Se crea por petición; se encola, apila, audita, deshace | Vive lo que el contexto; se invoca mil veces |
| Interfaz típica | ejecutar() sin argumentos (todo va dentro) |
calcular(datos) con argumentos (los datos llegan de fuera) |
Prueba del algodón: mira la firma. Si el método no necesita argumentos porque el objeto ya lleva la petición completa dentro, es Command; si recibe los datos en cada llamada, es Strategy.
Observer vs. Mediator
Los dos desacoplan comunicación:
| Observer | Mediator | |
|---|---|---|
| Topología | Difusión: uno emite, N anónimos escuchan | Estrella: N colegas hablan con un centro que dirige |
| ¿Hay protocolo? | No: cada observador reacciona por su cuenta, sin orden garantizado | Sí: el mediador decide quién hace qué y cuándo |
| El emisor, ¿espera respuesta/coordinación? | No: "ha pasado esto", y sigue | Sí: el aviso dispara decisiones sobre otros |
| Añadir un interesado | Suscribirlo; nadie más se entera | El mediador probablemente deba conocer su papel |
Prueba del algodón: ¿el que avisa necesita que alguien decida qué pasa después (Mediator), o solo que quien quiera se entere (Observer)?
Template Method vs. Strategy
El careo herencia/composición:
| Template Method | Strategy | |
|---|---|---|
| Varía | Pasos de un flujo fijo | El algoritmo entero |
| Mecanismo | Herencia; se decide al instanciar | Composición; intercambiable en ejecución |
| Combinar ejes de variación | Mal (subclase por combinación) | Bien (una estrategia por eje) |
Prueba del algodón: ¿necesitas cambiar la variante en caliente o combinar ejes? Composición (Strategy). ¿Flujo fijo, variantes pocas y estables que comparten contexto? Plantilla.
Chain of Responsibility vs. Decorator
El careo entre familias (lo prometimos en el módulo 3): ambos son objetos enlazados con la misma interfaz que delegan al siguiente.
| Chain of Responsibility | Decorator | |
|---|---|---|
| Delegación | Condicional: cada eslabón decide atender, cortar o pasar | Incondicional: cada capa siempre llama al envuelto |
| Los eslabones/capas | Hacen cosas equivalentes (variantes de "atender") | Añaden responsabilidades distintas sobre un núcleo |
| Puede no llegar al final | Sí, por diseño (corte, veto) | No: la llamada atraviesa todas las capas |
| Intención | Encontrar quién atiende / filtrar | Sumar comportamiento conservando la interfaz |
Prueba del algodón: ¿algún elemento puede legítimamente cortar la cadena? Chain. ¿Todos aportan siempre su capa? Decorator.
Guía de decisión
El árbol de preguntas para orientarse (como toda guía: brújula, no ley — confirma después contra el careo correspondiente):
flowchart TD
A[¿Cuál es tu problema de conducta?] --> B{¿Va de avisar<br/>o coordinar objetos?}
A --> C{¿Va de encapsular<br/>una petición u operación?}
A --> D{¿Va de variar<br/>un comportamiento?}
A --> E{¿Va de operar sobre<br/>una estructura de objetos?}
B --> B1{¿Difundir un cambio a<br/>interesados anónimos?}
B1 -- Sí --> OBS[Observer]
B1 -- "No: hay protocolo<br/>que dirigir" --> MED[Mediator]
C --> C1{¿Encolar, deshacer,<br/>auditar la petición?}
C1 -- Sí --> CMD[Command]
C1 -- "No: buscar quién<br/>la atiende / filtrarla" --> COR[Chain of Responsibility]
C1 -- "No: la escriben como<br/>texto de un mini-lenguaje" --> INT[Interpreter]
D --> D1{¿Depende del estado interno,<br/>con transiciones?}
D1 -- Sí --> STA[State]
D1 -- No --> D2{¿Varía el algoritmo entero<br/>o pasos de un flujo fijo?}
D2 -- Entero --> STR[Strategy]
D2 -- Pasos --> TM[Template Method]
E --> E1{¿Solo recorrerla?}
E1 -- Sí --> ITE[Iterator]
E1 -- "No: añadir operaciones<br/>por tipo de nodo" --> VIS[Visitor]
E --> E2{¿Guardar y restaurar<br/>su estado?}
E2 -- Sí --> MEM[Memento]
Y el recordatorio de siempre, herencia de la lección de la balanza: la primera opción válida es ninguno. Un if, una llamada directa o un enum siguen siendo la respuesta correcta cuando el síntoma no ha aparecido.
Combinaciones frecuentes
Los patrones de comportamiento trabajan en equipo mejor que ninguna otra familia:
- Command + Memento: el dúo del undo robusto — inversa cuando es simétrica y barata, foto cuando la inversa miente. El
PanelGestionapila comandos; los comandos difíciles guardan mementos de su receiver. - Observer + Mediator: la
CentralRepartopuede enterarse de los cambios de estado del pedido como un observador más (transitarAnotifica) y dirigir la reacción como mediadora — difusión para enterarse, protocolo para actuar. - Composite + Iterator + Visitor: el trío de las estructuras — Composite define el árbol de la carta, Iterator lo recorre sin exponerlo, Visitor le añade operaciones sin tocarlo. Tres lecciones, una sola carta.
- State + Observer: State autoriza las transiciones del pedido; Observer difunde las que ocurren. Conectados en un solo punto:
transitarA. - Mediator + Strategy: el mediador orquesta; sus criterios variables (asignación de repartidor) son estrategias inyectadas.
- Template Method + Strategy/Bridge: el flujo fijo por herencia, los ejes que cambian en caliente por composición — el ejercicio final de Template Method sobre las
Notificacion. - Chain + Command: por la cadena pueden viajar comandos: la petición reificada busca su manejador.
- Interpreter + Visitor + Flyweight: sobre el AST de reglas — evaluar/imprimir/optimizar como visitantes, terminales repetidos compartidos.
Nota la constante: las combinaciones no se diseñan "por catálogo" — surgen de que cada patrón resuelve su síntoma y los síntomas conviven en el mismo sistema.
El módulo 4 en el mapa de PideYa
El repaso aplicado, siguiendo el viaje de un pedido:
- Entra el pedido → la cadena de validación (
ManejadorFraude→ManejadorZonaReparto→ManejadorStock→ManejadorImporteMinimo) lo aprueba o rechaza, montada por configuración y disparada por laFachadaCheckout— Chain of Responsibility. - Se calcula el envío con la
CalculoEnviodel mercado (distancia, plana, gratis por promoción), y las promociones se evalúan con lasExpresionReglaque marketing escribe como texto — Strategy e Interpreter. - El cliente edita el carrito con puntos de retorno:
Carrito.Mementoen elHistorialCarrito— Memento. - El pedido vive su ciclo:
EstadoPedidoautoriza cada transición (CREADO → PAGADO → EN_PREPARACION → EN_REPARTO → ENTREGADO / CANCELADO) — State — y cada transición legal se difunde aNotificadorCliente,NotificadorRepartidor,MonitorCocinayPanelEstadisticas— Observer, saldando la deuda de la lección 01-01. - El restaurante gestiona desde su panel con
Comandos apilables, deshacibles y encolables — Command. - El reparto se coordina en estrella:
CentralRepartomedia entre cocina, pedidos y repartidores, con laEstrategiaAsignacionintercambiable — Mediator + Strategy. - La carta se explota: recorrida con
Iterable<Plato>(buscador, streams) y operada porVisitanteCarta(exportación, alérgenos, auditoría) — Iterator y Visitor. - Cada noche, los informes de cierre siguen el esqueleto de
InformeCierrecon sus pasos por formato — Template Method.
Ejercicios
Ejercicio 1: diagnóstico exprés
Para cada síntoma, nombra el patrón (y, si dudaste entre dos, cuál descartaste y por qué):
- "Cuando el repartidor marca 'entregado', deben reaccionar la app del cliente, la facturación y las métricas — y el mes que viene, el programa de puntos."
- "El asistente de onboarding de restaurantes tiene 6 pantallas con el mismo flujo (validar → guardar → siguiente) y pasos distintos por pantalla."
- "Queremos que soporte pueda revertir las últimas 10 acciones hechas sobre un pedido, con auditoría de quién hizo qué."
- "La tarifa de la comisión se calcula distinto para restaurantes premium, estándar y nuevos, elegida por su contrato."
- "Un ajuste de precio pasa por: validación automática → aprobación del gestor de zona → aprobación de finanzas si supera el 10%."
Ejercicio 2: el careo en código
Sin mirar las lecciones: escribe las dos "pruebas del algodón" que usarías ante un código dudoso entre (a) State y Strategy, (b) Chain y Decorator. Después aplica (a) a este caso: CalculadoraImpuestos recibe en el constructor un RegimenFiscal que jamás cambia tras construirse y cuyas variantes (RegimenGeneral, RegimenSimplificado) no se conocen entre sí.
Ejercicio 3: combinar con criterio
El equipo quiere "deshacer" también en la edición de la carta del restaurante: cada operación del editor (renombrar sección, cambiar precio, mover plato) debe poder revertirse, y "reequilibrar precios" (masivo, con redondeos) también. Diseña la solución nombrando los patrones que combinarías y qué papel juega cada uno.
Soluciones
Solución 1:
- Observer — interesados variables y anónimos ante un cambio. (Descartado Mediator: nadie dirige un protocolo; cada uno reacciona a lo suyo.)
- Template Method — flujo fijo, pasos variables por pantalla. (Descartado Strategy: no varía el algoritmo entero ni hace falta cambiarlo en caliente.)
- Command (+ Memento para las acciones sin inversa limpia) — peticiones reificadas con histórico, undo y auditoría.
- Strategy — algoritmos alternativos elegidos desde fuera (el contrato), sin transiciones entre ellos. (Descartado State: un régimen no "transita" a otro por las operaciones.)
- Chain of Responsibility — la petición escala por manejadores que la aprueban o la pasan, con eslabones condicionales (finanzas solo a veces). (Descartado Decorator: hay corte y condición, no capas que siempre suman.)
Solución 2: (a) ¿el objeto delegado se sustituye a sí mismo desde dentro, siguiendo un grafo de transiciones? → State; ¿lo elige el exterior y las variantes se ignoran? → Strategy. (b) ¿algún elemento puede legítimamente cortar la cadena? → Chain; ¿todos aportan siempre su capa? → Decorator. El caso: Strategy — lo fija el exterior al construir, sin transiciones ni conocimiento mutuo. (Que "jamás cambie tras construirse" no lo convierte en otra cosa: la intercambiabilidad es entre instancias del contexto, no necesariamente en caliente.)
Solución 3: Command como columna vertebral: cada operación del editor es un Comando con ejecutar()/deshacer(), apilado en un invoker con pila (el patrón del PanelGestion). Las operaciones simples y simétricas (renombrar) deshacen por inversa; "reequilibrar precios" deshace por Memento — su ejecutar() captura antes una instantánea de la carta (copia profunda del Composite, disciplina Prototype) y su deshacer() la restaura. Opcional y coherente: los cambios confirmados se difunden por Observer (la caché ProxyCacheCatalogo y el buscador quieren enterarse). Command da el marco uniforme; Memento entra solo donde la inversa no llega — combinar es asignar a cada patrón su síntoma, no apilarlos por gusto.
Conclusión
Ya distingues a los once por la intención, que es lo único que a veces los separa: sabes qué reifica cada uno, tienes los cinco careos con sus pruebas del algodón, el árbol de decisión para orientarte y las combinaciones que funcionan porque cada pieza ataca su propio síntoma. Y PideYa quedó como demostración viviente: de la cadena que filtra pedidos al visitante que audita la carta, cada patrón del módulo está instalado donde su dolor lo reclamaba.
Cierre: el catálogo está completo
Los 23 patrones del GoF están ahora en tu caja de herramientas: los creacionales resolvieron el nacimiento de los objetos, los estructurales su anatomía, y los de comportamiento sus conversaciones — quién avisa a quién, dónde viven los algoritmos, cómo se deshace lo hecho. Hasta la deuda más antigua del curso, aquel cambiarEstado de la primera lección, quedó saldada por Observer con State vigilando la puerta.
Pero conocer el catálogo no es saber usarlo — es la diferencia entre tener las herramientas y ser buen carpintero. Las preguntas que vienen ahora son las difíciles: ¿cómo se elige patrón ante un problema real que no llega etiquetado? ¿Cómo se refactoriza código vivo hacia un patrón sin romperlo? ¿Cuándo un patrón bien aplicado se convierte en un antipatrón? ¿Qué patrones usan de verdad Spring, el JDK o el código de tu empresa? Ese es el oficio, y es el módulo entero que empieza: nos vemos en Cómo Seleccionar el Patrón Adecuado.
Curso de Patrones de Diseño de Software
Módulo 1: Introducción a los Patrones de Diseño
- ¿Qué son los Patrones de Diseño?
- Historia y Origen de los Patrones de Diseño
- Principios de Diseño: SOLID y Otros Fundamentos
- UML Esencial para Entender Patrones
- Clasificación de los Patrones de Diseño
- Ventajas y Desventajas de Usar Patrones de Diseño
Módulo 2: Patrones Creacionales
- Introducción a los Patrones Creacionales
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Comparativa y Elección de Patrones Creacionales
Módulo 3: Patrones Estructurales
- Introducción a los Patrones Estructurales
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Comparativa y Elección de Patrones Estructurales
Módulo 4: Patrones de Comportamiento
- Introducción a los Patrones de Comportamiento
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
- Comparativa y Elección de Patrones de Comportamiento
Módulo 5: Aplicación de Patrones de Diseño
- Cómo Seleccionar el Patrón Adecuado
- Ejemplos Prácticos de Uso de Patrones
- Patrones de Diseño en Proyectos Reales
- Refactorización Usando Patrones de Diseño
- Antipatrones: Cuándo los Patrones se Vuelven un Problema
Módulo 6: Patrones de Diseño Avanzados
- Patrones de Diseño en Arquitecturas Modernas
- Patrones de Diseño en Microservicios
- Patrones de Diseño en Sistemas Distribuidos
- Patrones de Concurrencia
- Patrones de Diseño en Desarrollo Ágil
