Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 25 min

Patrones Estructurales

Los patrones estructurales se ocupan de cómo se componen clases y objetos para formar estructuras más grandes. Resuelven problemas de adaptación, decoración, simplificación de interfaces complejas y composición jerárquica. Los principales son: Adapter, Bridge, Composite, Decorator, Facade, Proxy y Flyweight.

Adapter y Bridge

Adapter convierte la interfaz de una clase en otra que el cliente espera — es como un adaptador de enchufe. Útil para integrar librerías de terceros con tu interfaz existente. Bridge separa la abstracción de su implementación para que ambas puedan variar independientemente. Donde Adapter trabaja con código existente, Bridge se diseña desde el principio para separar dos dimensiones de variación.

Composite y Decorator

Composite permite tratar objetos individuales y composiciones de objetos de manera uniforme mediante una interfaz común — útil para estructuras de árbol (UI components, filesystem, menús). Decorator agrega responsabilidades a un objeto dinámicamente sin subclasificar. En Java, los streams de I/O (BufferedInputStream wrapping FileInputStream) son el ejemplo canónico. Decorator respeta la interfaz original — el cliente no nota la diferencia.

Facade y Proxy

Facade proporciona una interfaz simplificada a un subsistema complejo — un punto de entrada único que oculta la complejidad interna. No previene acceso directo al subsistema, solo simplifica el caso común. Proxy controla el acceso a otro objeto, añadiendo funcionalidad extra: lazy loading (Virtual Proxy), control de acceso (Protection Proxy), logging/caché (Proxy remoto). Spring AOP usa proxies dinámicos para transacciones y seguridad.

Puntos clave

  • Adapter hace compatible lo incompatible. Decorator agrega comportamiento. Proxy controla el acceso. Facade simplifica.
  • Composite y Decorator comparten la misma interfaz que decoran/componen — la diferencia es intención (estructura vs comportamiento).
  • En Java enterprise, Proxy es omnipresente: JPA lazy loading, Spring @Transactional, Spring Security — todos son proxies.

Code example

// Decorator: logging transparente
interface OrderService { Order process(Order o); }
class LoggingOrderService implements OrderService {
  private final OrderService delegate;
  public Order process(Order o) {
    log.info("Processing {'}", o.getId());
    return delegate.process(o);
  }
}