Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 25 min

Patrones de Comportamiento

Los patrones de comportamiento definen cómo los objetos interactúan y distribuyen responsabilidades entre sí. Resuelven la comunicación entre objetos de forma desacoplada. Los más importantes para entrevistas son: Observer, Strategy, State, Template Method y Command.

Observer y Strategy

Observer define una dependencia uno-a-muchos entre objetos — cuando uno cambia, todos sus dependientes son notificados. Es la base de los event listeners, sistemas reactivos y data binding en UI. Strategy encapsula una familia de algoritmos intercambiables. En lugar de if/else o switch para elegir comportamiento, inyectás la estrategia. Útil para sorting, pricing, routing, validación — cualquier algoritmo que varía.

State y Template Method

State permite que un objeto cambie su comportamiento cuando su estado interno cambia — parece que cambiara su clase. Cada estado concreto implementa la misma interfaz y el contexto delega en el estado actual. Template Method define el esqueleto de un algoritmo en una clase base y deja que las subclases implementen pasos específicos. Es el opuesto de Strategy: usa herencia en lugar de composición.

Command e Iterador

Command encapsula una solicitud como un objeto, permitiendo parametrizar clientes, hacer queue de requests, implementar undo/redo y logging de operaciones. Cada comando tiene execute() y opcionalmente undo(). Iterador proporciona una forma de acceder secuencialmente a los elementos de una colección sin exponer su representación interna — Iterable/Iterator en Java es la implementación canónica.

Puntos clave

  • Strategy y State se parecen estructuralmente, pero Strategy es elegido por el cliente; State cambia internamente.
  • Observer es la base de la programación reactiva — RxJava, Project Reactor y los eventos de UI son Observer a escala.
  • Command habilita undo/redo, audit logs y job queues — cualquier sistema donde necesitás serializar o revertir acciones.

Code example

// Strategy: ordenamiento intercambiable
interface SortStrategy { void sort(List<Item> items); }
class PriceAscStrategy implements SortStrategy { ... }
class PopularityStrategy implements SortStrategy { ... }

class ProductCatalog {
  private SortStrategy strategy;
  void setStrategy(SortStrategy s) { this.strategy = s; }
  List<Item> getSorted(List<Item> items) {
    strategy.sort(items); return items;
  }
}