Estructurales

Cómo se componen clases y objetos en estructuras más grandes y flexibles.

Los patrones estructurales explican cómo ensamblar objetos y clases en estructuras mayores manteniendo flexibilidad y eficiencia. Resuelven problemas de composición: adaptar interfaces incompatibles, agregar comportamiento sin herencia, separar abstracción de implementación o representar jerarquías parte-todo.

#La idea

Mientras los creacionales se ocupan de quién construye y los de comportamiento de cómo dialogan, los estructurales responden a una pregunta más sencilla pero crucial: ¿cómo se conectan estos objetos entre sí sin terminar en un acoplamiento rígido?

#Cuándo encajan

  • Tenés que integrar código viejo con una API moderna sin reescribir todo (Adapter).
  • Querés agregar funcionalidad opcional sin explosión de subclases (Decorator).
  • Manejás jerarquías recursivas (carpetas, árboles, menús) (Composite).
  • Querés ocultar un subsistema complejo detrás de una API simple (Facade).
  • Necesitás controlar el acceso a un objeto remoto, costoso o peligroso (Proxy).

#Cuándo NO los uses

  • Si la "incompatibilidad" la podés resolver renombrando un método, hacelo.
  • Decorator mal aplicado deriva en pilas de wrappers imposibles de debuggear.
  • Flyweight es una optimización: medí antes de aplicarlo.

#En este capítulo

Adapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy — los siete clásicos del GoF, cada uno con su ejemplo en C# y los tradeoffs reales que se ven en producción.

  • Adapter — Permite que objetos con interfaces incompatibles colaboren.
  • Bridge — Desacopla una abstracción de su implementación para que ambas evolucionen por separado.
  • Composite — Compone objetos en estructuras de árbol y los trata uniformemente como si fueran individuales.
  • Decorator — Añade responsabilidades a un objeto en runtime envolviéndolo en sucesivas capas.
  • Facade — Provee una interfaz simplificada a un subsistema complejo.
  • Flyweight — Comparte estado intrínseco entre muchos objetos para soportar grandes cantidades sin agotar memoria.
  • Proxy — Sustituye a otro objeto para controlar el acceso a él (lazy load, seguridad, caching, remoting).