Tengo una duda y en un escenario donde dependiendo ciertos factores tienes que usar el algoritmo de encriptación AES y CEASAR, se usaría de todas maneras una condicional en la clase StrategyClient? al final se caeria en lo mismo que se trata de evitar no?
Hola Manuel, tengo un caso en una empresa de logistica y si bien sé que esto no es un consultaria me gustaría tener tu punto de vista a problematicas reales de negocio. Esta empresa tiene n clientes y cada cliente usualmente envia sus ordenes de entrega en archivos (txt, xlsx o XML), en esencia cada cliente envia mas o menos la información requerida para crear una orden estandar, sin embargo como ya supondras, por cada cliente cambia el formato del archivo, la estructura de los datos y lo mas importante los codigos usados, por ejemplo un cliente puede enviar nombres de ciudades y otro enviar sus propios codigos de ciudades en cada caso los debo convertir a la codificación usada por la empresa logistica. Deseo implementar el uso del patron estrategia, ya he implementado las estrategias concretas e incluso cada una de ellas puede usar otras estrategias por ejemplo para leer el contenido de un archivo y devolverlo en una estructura tabular (para archivos txt o xlsx) o un Documento (XML). Uso SpringBoot y java 8+. Lo que siempre he querido mejorar ha sido: 1) Hacer uso de lo que has explicado del Contexto, En mi caso tengo un servicio que periodicamente recorre una estructura de directorios, cada directorio me dice a que cliente pertenece el archivo y de acuerdo con eso pues llamo un metodo de la estrategia concreta esto es un swicht(codigoCliente) .... case CLIENTE_TUBOS: servicioClienteTubo.procesar(rutaArchivo)... 2) Esto es un programa que lleva años funcionando pero me veo tentado a explorar el uso de EIP (www.enterpriseintegrationpatterns.com/), me han recomendado que pase todo eso a unas ETL como SQL Server Integration Services que aunque se usarlo, lo cierto es que con Java puedo reutilizar mucho codigo y me es mas facil gestionar errores y reiniciar las tareas desde cierto punto. 3) Tambien me ha tentado la idea de poder ir generando jars con ls implementaciones de las estrategias para cada cliente, por la aplicación de administración configurar a cada cliente la implementacion concreta que debe usar (Como cuando en herramientas como DBeaver o similares le indicamos la libreria que usaremos para la conexón a ls base de datos). Sucede que cada cliente puede tener implementaciones concrertas no solo para el procesamiento de diferntes tipos de ordenes (entradas de mercancia a bodega, despachos, traslados, destruccion de mercancia vencida,...) pero tambien tienen implementaciones diferentes para liquidar los servicios de almacenamiento o de transportes (entregas y recogidas), la idea es que la entrada o salida de un cliente requiera la menor modificacion del programa 5) En mi caso uso una BD SQL y un reto que tengo es como cumplo los requerimeintos especiales de información de cada cliente, esto es algunos clientes pueden requerir datos muy particulares de sus entregas por ejemplo hay un cliente que nos pidio que cada producto en una entrega viniese con una relación de unos codigos documentos sanitarios que da el gobierno o que cada electrodomestico venga con un serial o un dato de su importación o un dato tecnico por ejemplo un numero de 1 a 5 que sea la calidad de esa instancia de producto. Estos son datos que solo usará una estrategia concreta pero si lo meto en las tablas estandares de alguna manera contamino mi modelo estandar con cosas particulares de cada cliente, si creo una tabla tipo nombreatributo-valor asociada a las entidades que tengan este requerimiento me funciona muy bien pero no me gusta dos cosas a) el valor lo almaceno como texto y me toca controlar que alli se meta un valor del tipo valido y b) para el tema de algunos reportes en linea que me piden, me toca hacer una operacion PIVOT de estos atributos, lo cual ademas de crearme una dependecia con el motor de BD a veces esto puede generarme problema de desempeños... la opción NoSQL entiendo sería ideal en este caso... pero la empresa no se quiere meter con este tipo de base de datos. Tengo mas preguntas... pero no quiero pasar la raya entre plantear un tema interesante para aprender y el descaro.
Buenas Manuel, antes de nada agradecerte toda la información que compartes en tú canal. Quería preguntarte, si podría realizarse esa inicialización de propiedades en el constructor en vez del método adicional init. ¿Lo has puesto en ese método para "forzar" la implementación en el caso que sea necesaria?
Realmente no. Tienen una estructura de clases similar, pero la intención de cada patrón, así como los métodos que se definen en cada uno, son muy diferentes.
Manuel saludos excelente video. Una duda ¿realmente es necesario tener un constructor en la clase StrategyContext para recibir la clase concreta? Si queremos asegurarnos de que se nos llame correctamente, bastaría con agregar un assert en el método setStrategy. Ademas si lo hacemos a través del constructor, estaríamos estableciendo una relación de composición permanente, lo cual no creo que sea deseado. En cambio, al utilizar el método setStrategy, tendríamos una relación de asociación de uso, que sería lo ideal ya que es dinámica y momentánea. ¿Estoy equivocado?
👉 Conoce más del CURSO PRÁCTICO DE PATRONES DE DISEÑO:
manuelzapata.co/curso-pdd
Muchas gracias, explicas muy bien, super útil !!!
Excelente aporte. Gracias.
Gracias Carlos!
Excelente ejemplo para entender el patrón strategy.
Gracias!
Tengo una duda y en un escenario donde dependiendo ciertos factores tienes que usar el algoritmo de encriptación AES y CEASAR, se usaría de todas maneras una condicional en la clase StrategyClient? al final se caeria en lo mismo que se trata de evitar no?
tengo la misma duda
Al momento de crear las estrategias y los contextos; Se puede usar el patron Factory?
Buenas tardes Hijo, interesante contenido
Muy buenos videos
Gracias!
Hola Manuel, tengo un caso en una empresa de logistica y si bien sé que esto no es un consultaria me gustaría tener tu punto de vista a problematicas reales de negocio. Esta empresa tiene n clientes y cada cliente usualmente envia sus ordenes de entrega en archivos (txt, xlsx o XML), en esencia cada cliente envia mas o menos la información requerida para crear una orden estandar, sin embargo como ya supondras, por cada cliente cambia el formato del archivo, la estructura de los datos y lo mas importante los codigos usados, por ejemplo un cliente puede enviar nombres de ciudades y otro enviar sus propios codigos de ciudades en cada caso los debo convertir a la codificación usada por la empresa logistica. Deseo implementar el uso del patron estrategia, ya he implementado las estrategias concretas e incluso cada una de ellas puede usar otras estrategias por ejemplo para leer el contenido de un archivo y devolverlo en una estructura tabular (para archivos txt o xlsx) o un Documento (XML). Uso SpringBoot y java 8+. Lo que siempre he querido mejorar ha sido: 1) Hacer uso de lo que has explicado del Contexto, En mi caso tengo un servicio que periodicamente recorre una estructura de directorios, cada directorio me dice a que cliente pertenece el archivo y de acuerdo con eso pues llamo un metodo de la estrategia concreta esto es un swicht(codigoCliente) .... case CLIENTE_TUBOS: servicioClienteTubo.procesar(rutaArchivo)... 2) Esto es un programa que lleva años funcionando pero me veo tentado a explorar el uso de EIP (www.enterpriseintegrationpatterns.com/), me han recomendado que pase todo eso a unas ETL como SQL Server Integration Services que aunque se usarlo, lo cierto es que con Java puedo reutilizar mucho codigo y me es mas facil gestionar errores y reiniciar las tareas desde cierto punto. 3) Tambien me ha tentado la idea de poder ir generando jars con ls implementaciones de las estrategias para cada cliente, por la aplicación de administración configurar a cada cliente la implementacion concreta que debe usar (Como cuando en herramientas como DBeaver o similares le indicamos la libreria que usaremos para la conexón a ls base de datos). Sucede que cada cliente puede tener implementaciones concrertas no solo para el procesamiento de diferntes tipos de ordenes (entradas de mercancia a bodega, despachos, traslados, destruccion de mercancia vencida,...) pero tambien tienen implementaciones diferentes para liquidar los servicios de almacenamiento o de transportes (entregas y recogidas), la idea es que la entrada o salida de un cliente requiera la menor modificacion del programa 5) En mi caso uso una BD SQL y un reto que tengo es como cumplo los requerimeintos especiales de información de cada cliente, esto es algunos clientes pueden requerir datos muy particulares de sus entregas por ejemplo hay un cliente que nos pidio que cada producto en una entrega viniese con una relación de unos codigos documentos sanitarios que da el gobierno o que cada electrodomestico venga con un serial o un dato de su importación o un dato tecnico por ejemplo un numero de 1 a 5 que sea la calidad de esa instancia de producto. Estos son datos que solo usará una estrategia concreta pero si lo meto en las tablas estandares de alguna manera contamino mi modelo estandar con cosas particulares de cada cliente, si creo una tabla tipo nombreatributo-valor asociada a las entidades que tengan este requerimiento me funciona muy bien pero no me gusta dos cosas a) el valor lo almaceno como texto y me toca controlar que alli se meta un valor del tipo valido y b) para el tema de algunos reportes en linea que me piden, me toca hacer una operacion PIVOT de estos atributos, lo cual ademas de crearme una dependecia con el motor de BD a veces esto puede generarme problema de desempeños... la opción NoSQL entiendo sería ideal en este caso... pero la empresa no se quiere meter con este tipo de base de datos. Tengo mas preguntas... pero no quiero pasar la raya entre plantear un tema interesante para aprender y el descaro.
Buen video, recomendarias el uso de maquinas de estado para la implementación de este patron? Saludos!!
Si necesito estados, probablemente me iría por un patrón de State, y no Strategy.
Buenas Manuel, antes de nada agradecerte toda la información que compartes en tú canal.
Quería preguntarte, si podría realizarse esa inicialización de propiedades en el constructor en vez del método adicional init.
¿Lo has puesto en ese método para "forzar" la implementación en el caso que sea necesaria?
Es como el patrón repository?
Realmente no. Tienen una estructura de clases similar, pero la intención de cada patrón, así como los métodos que se definen en cada uno, son muy diferentes.
que IDE usas?
Por estos días, Cursor.
Manuel saludos excelente video. Una duda ¿realmente es necesario tener un constructor en la clase StrategyContext para recibir la clase concreta? Si queremos asegurarnos de que se nos llame correctamente, bastaría con agregar un assert en el método setStrategy. Ademas si lo hacemos a través del constructor, estaríamos estableciendo una relación de composición permanente, lo cual no creo que sea deseado. En cambio, al utilizar el método setStrategy, tendríamos una relación de asociación de uso, que sería lo ideal ya que es dinámica y momentánea. ¿Estoy equivocado?
Aquí es donde viene el poder de ajustar el patrón a tus necesidades. Si consideras que es mejor pasar la dependencia con un método set, perfecto!