Café y Código

3. Patrones estructurales

Explican cómo componer clases y objetos para obtener estructuras más grandes: adaptar interfaces, añadir comportamiento por capas, unificar árboles, simplificar fachadas o compartir estado intrínseco.

Catálogo en Refactoring.Guru ↗

Adapter (Refactoring.Guru ↗)

Envuelves una interfaz existente para que otra parte del sistema pueda usarla sin modificar el código original.

Ejemplo ilustrativo — Adapter
JAVA
1 // Cliente espera EnchufeEU
2 class Adaptador implements EnchufeEU {
3 private EnchufeUS us;
4 void enchufar() { us.plug(); }
5 }

Bridge (Refactoring.Guru ↗)

Separas una jerarquía de abstracción de la de implementación para que evolucionen de forma independiente.

Ejemplo ilustrativo — Bridge
JAVA
1 abstract class Vista {
2 protected ApiRender api;
3 Vista(ApiRender api) { this.api = api; }
4 abstract void dibujar();
5 }

Composite (Refactoring.Guru ↗)

Tratas objetos simples y compuestos (árboles) de forma uniforme mediante una interfaz común.

Ejemplo ilustrativo — Composite
JAVA
1 interface Nodo { int tamano(); }
2 class Hoja implements Nodo { int tamano() { return 1; } }
3 class Carpeta implements Nodo {
4 List<Nodo> hijos;
5 int tamano() { return hijos.stream().mapToInt(Nodo::tamano).sum(); }
6 }

Decorator (Refactoring.Guru ↗)

Añades responsabilidades dinámicamente envolviendo objetos en “capas” compatibles con la misma interfaz.

Ejemplo ilustrativo — Decorator
JAVA
1 interface Cafe { double costo(); }
2 class Leche implements Cafe {
3 Cafe interior;
4 double costo() { return interior.costo() + 0.5; }
5 }

Facade (Refactoring.Guru ↗)

Ofreces un punto de entrada simple a un subsistema complejo reduciendo el acoplamiento del cliente.

Ejemplo ilustrativo — Facade
JAVA
1 class FacadeVideo {
2 void reproducir(String f) {
3 new Decoder().decode(f);
4 new Audio().play();
5 }
6 }

Flyweight (Refactoring.Guru ↗)

Compartes estado intrínseco entre muchas instancias para ahorrar memoria en objetos muy repetidos.

Ejemplo ilustrativo — Flyweight
JAVA
1 // Estado intrínseco compartido (color de tile)
2 class TileFlyweight { String color; }
3
4 class TileFactory {
5 Map<String, TileFlyweight> pool = new HashMap<>();
6 }

Proxy (Refactoring.Guru ↗)

Sustituto que controla el acceso al objeto real (lazy load, permisos, logging, remoto, etc.).

Ejemplo ilustrativo — Proxy
JAVA
1 interface Imagen { void mostrar(); }
2 class ProxyImagen implements Imagen {
3 RealImagen real;
4 void mostrar() {
5 if (real == null) real = new RealImagen();
6 real.mostrar();
7 }
8 }
Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.