version en video:
https://youtu.be/bswx9qvuCdg
Estaba realizando una transformacion que necesitaba una cache que otra persona del equipo estaba haciendo(en paralelo), entonces pensé en un proxy que se encargara de cargar ese cache y retornare la información que necesitaba(desde un cache quemado en memoria) mientras otra persona hacia el desarrollo.
luego cuando se realizo la integración real la función del proxy se convirtió en transformar el string json que devolvía la cache a una clase que yo pudiera usar con sus valores.
en la revisión del código me dijeron eso no es un cache, eso es un adapter. y tenían toda la razón aunque ambos son wrappers tienen sus diferencias, de hay nació este articulo.
Proxy
un proxy se usa para encapsular otro servicio o método(usualmente un servicio externo al no tenemos acceso directo) el proxy se encarga entonces de agregar algún comportamiento al método del otro servicio antes o después de llamarlo.con la salveda de que para que sea proxy debe tener la misma interfaz que el servicio origina ( osease que los métodos reciban y devuelvan el mismo tipo mediante una interfaz) por esto el error de arriba (el cache devolvía un string(cadena de texto) pero luego el proxy malo retornaba una clase). algunos ejemplo de proxy pueden ser.
- virtual proxy: se encarga de cargar otro servicio solo cuando se vaya a usar ese recurso, para hacer un lazy load(carga perezosa) por que el otro servicio es pesado de subir y puede que no siempre sea necesario.
- proxy de segurida: se usa para restringir acceso a cierto recurso a algún usuario.
- proxy de loggeo: para loggear o imprimir en pantalla informacion que recibe o responde un servicio.
Adapter.
Es otro tipo de wrapper que se usa cuando no queremos la interfaz original del servicio base, en la historia anterior ese servicio no era un proxy sino un adapter pues estaba encargado de transformar un json como string del cache original en un clase kotlin. (este tipo de transformacion por ejemplo si el servicio original retorna un xml pero nosotros queremos integrarnos con json se les llama adapter)
imagen de: https://zh.wikivoyage.org/wiki/File:FTT102017.jpg
Decorator
este es el mas complejo de los 3, un decorador es como un proxy dentro de otro, dentro de otro ......
image de: https://www.publicdomainpictures.net/es/view-image.php?image=19582&picture=munecas-rusas
la funcion del decorator es posibilitar encadenar comportamiento(en un orden personalizable) conservando la misma interfaz (decorar) y es frecuentemente usado en aplicaciones tipo stream.
en mi caso no entendía como funcionaba el decorator hasta que hice un ejemplo que se puede encontrar en https://github.com/chalimbu/decorator-java/tree/feature/solucionEjercisio1 aqui hice un decorador bobo para entender el concepto una clase que imprime en pantalla y unos decoradores para agregarle un mensaje(la fecha, una tag de error o info) al mensaje original por medio de decoradores que se construye en el Main.java. recomendado ver el ejemplo en el siguiente orden.
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/Logger.java
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/decorators/SystemLogger.java
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/decorators/SystemLoggerDecorator.java -> el decorador que sirve para encapsular los otros 3 siguientes.
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/decorators/SystemLoggerDateDecorator.java
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/decorators/SystemLoggerErrorDecorator.java
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/decorators/SystemLoggerInfoDecorator.java
- https://github.com/chalimbu/decorator-java/blob/feature/solucionEjercisio1/src/com/decorator/Main.java -> usando las clases definidas antes.
estos 3 patrones tienen sus diferencias y su similitud que todos se encargan de servir de envoltura para otro servicio.
fuente:
la información viene de https://refactoring.guru/design-patterns/decorator donde se explica muy bien.
No hay comentarios:
Publicar un comentario