Saltar al contenido

¿En qué se diferencian los patrones de proxy, decorador, adaptador y puente?

Solución:

Proxy, Decorator, Adapter y Bridge son variaciones de “envolver” una clase. Pero sus usos son diferentes.

  • Apoderado podría usarse cuando desee crear una instancia diferida de un objeto, u ocultar el hecho de que está llamando a un servicio remoto, o controlar el acceso al objeto.

  • Decorador también se denomina “Proxy inteligente”. Esto se usa cuando desea agregar funcionalidad a un objeto, pero no extendiendo el tipo de ese objeto. Esto le permite hacerlo en tiempo de ejecución.

  • Adaptador se utiliza cuando tiene una interfaz abstracta y desea asignar esa interfaz a otro objeto que tiene una función funcional similar, pero una interfaz diferente.

  • Puente es muy similar a Adapter, pero lo llamamos Bridge cuando define tanto la interfaz abstracta como la implementación subyacente. Es decir, no se está adaptando a un código heredado o de terceros, es el diseñador de todo el código, pero necesita poder intercambiar diferentes implementaciones.

  • Fachada es una interfaz de nivel superior (léase: más simple) para un subsistema de una o más clases. Suponga que tiene un concepto complejo que requiere que se representen varios objetos. Hacer cambios en ese conjunto de objetos es confuso, porque no siempre sabes qué objeto tiene el método que necesitas llamar. Ese es el momento de escribir una fachada que proporcione métodos de alto nivel para todas las operaciones complejas que puede realizar con la colección de objetos. Ejemplo: un modelo de dominio para una sección de la escuela, con métodos como countStudents(), reportAttendance(), assignSubstituteTeacher(), etcétera.

Como dice la respuesta de Bill, su casos de uso son diferentes.

También lo son sus estructuras.

  • Apoderado y Decorador ambos tienen la misma interfaz que sus tipos envueltos, pero el proxy crea una instancia bajo el capó, mientras que el decorador toma una instancia en el constructor.

  • Adaptador y Fachada ambos tienen una interfaz diferente a la que envuelven. Pero el adaptador se deriva de una interfaz existente, mientras que la fachada crea una nueva interfaz.

  • Puente y Adaptador ambos apuntan a un tipo existente. Pero el puente apuntará a un tipo abstracto y el adaptador podría apuntar a un tipo concreto. El puente le permitirá emparejar la implementación en tiempo de ejecución, mientras que el adaptador normalmente no lo hará.

Mi opinión sobre el tema.

Los cuatro patrones tienen mucho en común, los cuatro a veces se denominan informalmente envoltorios o patrones de envoltorio. Todos usan la composición, envuelven el tema y delegan la ejecución al tema en algún momento, mapean una llamada de método a otra. Le ahorran al cliente la necesidad de tener que construir un objeto diferente y copiar todos los datos relevantes. Si se usan con prudencia, ahorran memoria y procesador.

Al promover el acoplamiento flexible, hacen que el código que alguna vez fue estable esté menos expuesto a cambios inevitables y sea más legible para otros desarrolladores.

Adaptador

El adaptador adapta al sujeto (adaptado) a una interfaz diferente. De esta manera podemos agregar objetos que se colocarán en una colección de tipos nominalmente diferentes.

El adaptador solo expone los métodos relevantes para el cliente, puede restringir todos los demás, revelando las intenciones de uso para contextos particulares, como adaptar una biblioteca externa, hacer que parezca menos general y más centrada en las necesidades de nuestra aplicación. Los adaptadores aumentan la legibilidad y la autodescripción de nuestro código.

Los adaptadores protegen a un equipo del código volátil de otros equipos; una herramienta para salvar vidas cuando se trata de equipos offshore 😉

El propósito menos mencionado es evitar que la clase de sujeto tenga un exceso de anotaciones. Con tantos marcos basados ​​en anotaciones, este uso se vuelve más importante que nunca.

El adaptador ayuda a sortear la limitación de Java de una única herencia. Puede combinar varios adaptadores en un sobre dando la impresión de herencia múltiple.

En cuanto al código, el adaptador es “delgado”. No debe agregar mucho código a la clase adaptee, además de simplemente llamar al método adaptee y las conversiones de datos ocasionales necesarias para realizar tales llamadas.

No hay muchos buenos ejemplos de adaptadores en JDK o bibliotecas básicas. Los desarrolladores de aplicaciones crean adaptadores para adaptar las bibliotecas a las interfaces específicas de la aplicación.

Decorador

El decorador no solo delega, no solo asigna un método a otro, hace más, modifica el comportamiento de algunos métodos de sujeto, puede decidir no llamar al método de sujeto en absoluto, delegar a un objeto diferente, un objeto de ayuda.

Los decoradores generalmente agregan (de forma transparente) funcionalidad al objeto envuelto como registro, cifrado, formateo o compresión al sujeto. Esta nueva funcionalidad puede traer una gran cantidad de código nuevo. Por lo tanto, los decoradores suelen ser mucho más “gordos” que los adaptadores.

El decorador debe ser una subclase de la interfaz del sujeto. Se pueden utilizar de forma transparente en lugar de sus temas. Consulte BufferedOutputStream, sigue siendo OutputStream y se puede utilizar como tal. Esa es una gran diferencia técnica con respecto a los adaptadores.

Ejemplos de libros de texto de toda la familia de decoradores están disponibles en JDK, Java IO. Todas las clases como BufferedOutputStream, FilterOutputStream y ObjectOutputStream son decoradores de OutputStream. Pueden tener capas de cebolla, donde un decorador se vuelve a decorar, agregando más funcionalidad.

Apoderado

El proxy no es un contenedor típico. Es posible que el objeto envuelto, el sujeto del proxy, aún no exista en el momento de la creación del proxy. El proxy a menudo lo crea internamente. Puede ser un objeto pesado creado bajo demanda, o un objeto remoto en diferentes JVM o diferentes nodos de red e incluso un objeto que no es Java, un componente en código nativo. No es necesario que se envuelva o delegue a otro objeto en absoluto.

Los ejemplos más típicos son proxies remotos, inicializadores de objetos pesados ​​y proxies de acceso.

  • Proxy remoto: el asunto está en un servidor remoto, en una JVM diferente o incluso en un sistema que no es Java. El proxy traduce las llamadas de método a llamadas RMI / REST / SOAP o lo que sea necesario, protegiendo al cliente de la exposición a la tecnología subyacente.

  • Proxy de carga diferida: inicialice completamente el objeto solo el primer uso o el primer uso intensivo.

  • Proxy de acceso: controla el acceso al asunto.

Fachada

La fachada está estrechamente asociada con el Principio de mínimo conocimiento (Ley de Demeter). Facade es muy similar a Adapter. Ambos se envuelven, ambos asignan un objeto a otro, pero difieren en la intención. Fachada aplana la estructura compleja de un sujeto, gráfico de objeto complejo, simplificando el acceso a una estructura compleja.

Facade envuelve una estructura compleja, proporcionándole una interfaz plana. Esto evita que el objeto del cliente se exponga a las relaciones internas en la estructura del sujeto y, por lo tanto, promueve un acoplamiento flexible.

Puente

Variante más compleja del patrón Adaptador donde no solo varía la implementación sino también la abstracción. Agrega una indirecta más a la delegación. La delegación extra es el puente. Desacopla el adaptador incluso de la interfaz adaptadora. Aumenta la complejidad más que cualquier otro patrón de envoltura, así que aplíquelo con cuidado.

Diferencias en constructores

Las diferencias de patrones también son obvias cuando se observan sus constructores.

  • Apoderado no envuelve un objeto existente. No hay sujeto en constructor.

  • Decorador y Adaptador envuelve un objeto ya existente, y tal es típicamente
    proporcionado en el constructor.

  • Fachada El constructor toma el elemento raíz de un gráfico de objeto completo; de lo contrario, tiene el mismo aspecto que el Adaptador.

Ejemplo de la vida real: Adaptador de clasificación JAXB. El propósito de este adaptador es el mapeo de una clase plana simple a una estructura más compleja requerida externamente y para evitar una clase de sujeto “contaminante” con anotaciones excesivas.

Si piensas que te ha sido de ayuda nuestro post, sería de mucha ayuda si lo compartieras con otros seniors así nos ayudas a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *