¿Te ha pasado esto al estudiar patrones de diseño?
«¿Qué diferencia hay entre Strategy y Template Method? ¿Y por qué aparece Command aquí?»
Los tres parecen intercambiar comportamientos, así que es fácil confundirlos.
Vamos con la idea clave.
Strategy sustituye el algoritmo completo,
Template Method mantiene la estructura y cambia solo algunos pasos,
y Command encapsula la «acción que se ejecutará» en un objeto para ejecutarla después.
Con esta frase ya tienes la mitad. Hoy distinguiremos claramente estos tres patrones con código.
Tres patrones: diferencias de un vistazo
Empecemos con una visión general en forma de tabla.
| Categoría | Patrón Strategy | Template Method | Patrón Command |
|---|---|---|---|
| Idea clave | Sustituir el algoritmo completo | Estructura fija, cambiar algunos pasos | Encapsular la acción en un objeto |
| Reutilización | Composición (delegación) | Herencia | Composición (delegación) |
| Momento del cambio | Tiempo de ejecución | Tiempo de compilación (herencia) | Tiempo de ejecución |
| Pregunta principal | «¿Cómo calcularlo?» | «Cuando el orden es igual, pero los detalles cambian» | «¿Cuándo y qué ejecutar?» |
Aquí está la razón por la que se confunden.
Los tres buscan separar las partes que pueden cambiar.
Pero difieren en cómo y para qué las separan. Vamos uno por uno.
Strategy sustituye el algoritmo completo
Strategy crea objetos independientes para distintas formas de hacer lo mismo y los intercambia cuando hace falta.
Los medios de pago son un buen ejemplo.
Tarjeta, KakaoPay o transferencia bancaria: el objetivo (pagar) es el mismo, pero el método cambia.
protocol PayStrategy {
func pay(_ amount: Int) -> String
}
struct CardPay: PayStrategy {
func pay(_ amount: Int) -> String { "Pago con tarjeta \(amount)" }
}
struct KakaoPay: PayStrategy {
func pay(_ amount: Int) -> String { "Pago con KakaoPay \(amount)" }
}
var strategy: PayStrategy = CardPay()
print(strategy.pay(10000))
// Salida: pago con tarjeta 10000
La clave es que cambiar la variable strategy por KakaoPay() en tiempo de ejecución sustituye todo el comportamiento.
La idea es delegar mediante composición (composition), no usar herencia.
Template Method conserva la estructura y cambia solo una parte
Template Method sigue un enfoque algo distinto.
El orden del flujo completo es fijo, pero las subclases rellenan algunos pasos.
Piensa en cocinar ramen: hervir agua → añadir ingredientes → terminar. El orden es igual; solo cambia «añadir ingredientes».
class Ramen {
func cook() { // Esto es Template Method
boilWater()
addIngredients() // Solo este paso se sustituye en la subclase
print("Terminado!")
}
func boilWater() { print("Hervir el agua") }
func addIngredients() { print("Ingredientes básicos") }
}
class CheeseRamen: Ramen {
override func addIngredients() { print("Añadir queso") }
}
CheeseRamen().cook()
// Salida: hervir el agua / añadir queso / terminado!
La diferencia decisiva con Strategy es que usa herencia y cambia solo algunos pasos, no el algoritmo entero.
La clase padre controla el flujo (cook).
Command encapsula la acción que se ejecutará
Command tiene un objetivo completamente distinto de los dos anteriores.
No trata de cómo calcular, sino de convertir la acción en un objeto para ejecutarla, cancelarla o encolarla después.
Piensa en un botón de mando a distancia. Guarda la orden «enciende la luz» como objeto y la ejecuta al pulsarlo.
protocol Command { func execute() }
struct LightOn: Command {
func execute() { print("Encender la luz") }
}
let button: Command = LightOn()
button.execute() // Yo decido cuándo se ejecuta
// Salida: encender la luz
Al envolver la solicitud en un objeto, resulta natural añadir undo, registros y colas de trabajo.
En resumen: Strategy elige el método; Command guarda y gestiona la solicitud.
Cuándo usarlo y cuándo evitarlo
En la práctica, suelo elegir con estos criterios.
- Patrón Strategy: hay varios algoritmos para el mismo objetivo y deben cambiarse en ejecución (ordenación, descuentos, pagos)
- Template Method: el orden siempre es igual y solo cambian algunos pasos (parseo de datos, turnos de un juego)
- Command: hay que posponer, cancelar, rehacer o encolar la ejecución (deshacer, planificador de tareas)
También hay señales para evitar estos patrones.
Si solo hay dos o tres ramas y no crecerán, no fuerces un patrón. Un simple if será más legible.
Template Method depende de la herencia; si la flexibilidad importa, suele ser más seguro considerar primero Strategy (composición).
Así pueden preguntarlo en una entrevista
P. ¿Cuál es la mayor diferencia entre Strategy y Template Method?
Strategy sustituye el algoritmo completo en ejecución mediante composición (delegación); Template Method fija la estructura mediante herencia y sobrescribe solo algunos pasos. Strategy ofrece más flexibilidad; Template Method controla mejor el flujo.
P. ¿En qué se diferencia Command de Strategy?
Strategy se centra en elegir el método; Command encapsula la solicitud en un objeto y permite undo, encolado y registro. Uno gestiona la elección del algoritmo y el otro, la solicitud.
Aunque parezcan similares, se distinguen al preguntar qué se separa y por qué.
Strategy es el método; Template Method, los huecos del flujo; Command, la solicitud. Recuerda estas tres palabras y dejarán de confundirte. ¡Feliz aprendizaje!

