¿Que son los Patrones de Diseno? Son soluciones estandar para problemas comunes en el diseno de software. Son como recetas probadas que los desarrolladores pueden adaptar para resolver problemas especificos en sus aplicaciones.
Imagina que estas construyendo una casa. No inventarias nuevas formas de hacer cimientos o instalar ventanas cada vez, ¿verdad? Usarias tecnicas probadas por generaciones de constructores.
Los patrones de diseno son exactamente eso: tecnicas probadas para construir software de calidad.
Se encargan de la creacion de objetos, ayudando a hacer un sistema independiente de como se crean, componen y representan sus objetos.
Como una fabrica de autos: diferentes lineas de produccion (patrones) para crear diferentes modelos (objetos).
Se ocupan de como se componen las clases y objetos para formar estructuras mas grandes y complejas.
Como construir con LEGO: diferentes piezas (objetos) se combinan para crear estructuras complejas.
Se centran en la comunicacion entre objetos, como interactuan y se distribuyen responsabilidades.
Como un equipo de futbol: cada jugador (objeto) tiene un rol y se comunica con otros para lograr un objetivo.
Previene que una aplicacion intente repetidamente una operacion que probablemente fallara. Como un interruptor electrico que salta cuando hay sobrecarga.
Aislamiento de fallos en componentes, evitando que un fallo en una parte afecte a otras. Como los compartimentos estancos de un barco.
Reintentar una operacion fallida con una estrategia inteligente (espera exponencial, jitter). Como volver a marcar un numero ocupado.
Establecer limites de tiempo para operaciones, cancelando las que tardan demasiado. Como un cronometro para cada tarea.
Los patrones de diseno son herramientas poderosas, pero recuerda:
// Interfaz para los observadores interface Observer { void update(String message); } // Implementacion concreta de un observador // Implementacion concreta de un observador class Cliente implements Observer { private String nombre; public Cliente(String nombre) { this.nombre = nombre; } @Override public void update(String message) { System.out.println(nombre + " recibio notificacion: " + message); } } // Clase observable (sujeto) class TiendaOnline { private Listclientes = new ArrayList<>(); private String nombreTienda; public TiendaOnline(String nombre) { this.nombreTienda = nombre; } // Registrar un nuevo observador public void suscribir(Observer cliente) { clientes.add(cliente); } // Eliminar un observador public void desuscribir(Observer cliente) { clientes.remove(cliente); } // Notificar a todos los observadores public void notificarOferta(String producto) { String mensaje = "Nueva oferta en " + producto + " en " + nombreTienda + "!"; for(Observer cliente : clientes) { cliente.update(mensaje); } } } // Uso del patru00f3n public class Main { public static void main(String[] args) { TiendaOnline miTienda = new TiendaOnline("TechPeru"); Cliente carlos = new Cliente("Carlos"); Cliente maria = new Cliente("Maria"); Cliente jose = new Cliente("Jose"); miTienda.suscribir(carlos); miTienda.suscribir(maria); miTienda.suscribir(jose); miTienda.notificarOferta("Laptops Gaming"); // Maria se desuscribe miTienda.desuscribir(maria); miTienda.notificarOferta("Smartphones"); } }