Patrones de diseño estructurales
Los patrones estructurales tratan de cómo encajan las piezas: una clase que no tiene la interfaz que necesitas, un objeto al que quieres añadir funciones sin crear una subclase por cada combinación, un subsistema con veinte clases que el resto del programa no debería conocer.
Casi todos se basan en la misma idea: envolver un objeto en otro que tiene la interfaz que hace falta (Adapter), que añade algo antes o después (Decorator, Proxy), que simplifica (Facade) o que trata igual a uno que a un grupo (Composite). Composición en vez de herencia.
Código en Java, Python, JavaScript, C# y PHP.
Los patrones
Adapter
Una clase que envuelve a otra cuya interfaz no es la que espera tu código y traduce cada llamada: usar una biblioteca de terceros, un sistema antiguo o un sensor de otro fabricante sin tocarlos.nivel básico2 ejerciciosDecorator
Añade funciones a un objeto envolviéndolo en otro con la misma interfaz, que hace algo más antes o después de pasarle la llamada. Los decoradores se apilan en cualquier orden y combinación.nivel intermedio2 ejerciciosFacade
Una clase que da una puerta sencilla a un subsistema complicado: matricular, comprar o encender el home cinema es una llamada, y la fachada coordina por dentro las clases que hagan falta en su orden.nivel básico2 ejerciciosComposite
Trata igual a un objeto suelto y a un grupo de objetos organizados en árbol: carpetas y ficheros, capítulos y partidas, menús y submenús. Cada operación se resuelve con una llamada recursiva.nivel intermedio2 ejerciciosProxy
Un objeto con la misma interfaz que otro que controla el acceso a él: lo crea solo cuando hace falta (perezoso), guarda sus respuestas (caché) o comprueba permisos antes de dejar pasar cada llamada.nivel intermedio2 ejercicios
Cuál elegir
| Patrón | Resuelve | Lo verás en |
|---|---|---|
| Adapter | Usar una clase cuya interfaz no es la que esperas | Arrays.asList(), InputStreamReader, adaptadores de RecyclerView |
| Decorator | Añadir funciones a un objeto sin subclases por cada combinación | BufferedReader(new FileReader()), middlewares |
| Facade | Dar una puerta sencilla a un subsistema complicado | Una clase servicio que esconde DAO, correo y pagos |
| Composite | Tratar igual a un objeto y a un grupo de objetos | Carpetas y ficheros, el DOM, menús con submenús |
| Proxy | Controlar el acceso a otro objeto: perezoso, caché, permisos | Entidades perezosas de Hibernate, Spring @Transactional |