2.1 Adaptador
Adapter (Adaptador) es un patrón de diseño estructural diseñado para organizar el uso de las funciones de un objeto que no está disponible para su modificación a través de una interfaz especialmente creada.
La definición oficial es un poco complicada, pero si la expresas con tus propias palabras, un adaptador es un patrón de diseño que permite que los objetos con interfaces incompatibles funcionen juntos .

Se utiliza para organizar el uso de las funciones de un objeto que no está disponible para su modificación a través de una interfaz especialmente creada. Se crea una clase adicional que tiene la interfaz requerida, y esta clase a su vez llama a los métodos del objeto deseado (que no tiene la interfaz requerida).
¡Importante! Si en el código encuentra el sufijo Adaptador para una clase, entonces tiene todo el derecho de considerar que esta clase actúa como un adaptador y está asociada con un grupo de clases que funcionan de acuerdo con el esquema descrito anteriormente.
Se utiliza en los casos en que el sistema admite los datos y el comportamiento necesarios, pero tiene una interfaz inadecuada. El uso más común del patrón Adapter es cuando desea crear una clase que herede de una clase abstracta nueva o existente.
Fortalezas:
- La transición al uso de otras clases externas no requiere volver a trabajar el sistema en sí, es suficiente implementar una clase de Adaptador más.
- Independencia de la implementación de clases externas (clases de bibliotecas cuyo código no podemos cambiar). Su programa se vuelve independiente de la interfaz de clases externas.
2.2 Decoradores
Decorator es un patrón de diseño estructural para adjuntar dinámicamente un comportamiento adicional a un objeto. El patrón Decorator proporciona una alternativa buena y flexible a la práctica de subclasificación para ampliar la funcionalidad.

Se utiliza para conectar dinámicamente obligaciones adicionales a un objeto.
Muchos de ustedes se preguntarán: ¿cómo pueden dinámicamente (mientras el programa se está ejecutando) agregar un nuevo comportamiento a un objeto? Un objeto se puede ensamblar a partir de piezas, es decir, objetos pequeños. ¿Recuerdas las cadenas de filtros en los servlets? ¿O la Stream API cuando escribió una consulta usando filter(), map(), list()?
IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);
Puntos fuertes del patrón Decorador:
- No es necesario crear subclases para ampliar la funcionalidad de un objeto.
- La capacidad de conectar dinámicamente nuevas funcionalidades en cualquier lugar: antes o después de la funcionalidad principal del objeto ConcreteComponent.
2.3 Apoderados
Proxy es un patrón de diseño estructural que proporciona un objeto que controla el acceso a otro objeto, interceptando y pasando todas sus llamadas.

El patrón Proxy proporciona un objeto sustituto en lugar del objeto real. Este objeto controla el acceso al objeto original. Usado muy a menudo.
¿Recuerda cómo usamos el marco Mockito e interceptamos una llamada a un objeto real usando el método Mockito.spy() o la anotación @Spy? Fue entonces cuando se creó un objeto Proxy especial, a través del cual pasaron todas las llamadas al objeto original.
Y luego podríamos administrar estas llamadas agregando reglas al objeto. Así es: el objeto original no cambia y trabajar con él se vuelve mucho más flexible. Es especialmente útil cuando no llamamos al objeto proxy desde nuestro código, sino que lo pasamos a alguna parte. Controlando así la comunicación de dos objetos independientes de nosotros.
Tipos de apoderados por finalidad:
- Proxy de registro : registra todas las llamadas al "Asunto" con sus parámetros.
- Proxy remoto (proxies remotos): proporciona comunicación con el “Sujeto”, que se encuentra en un espacio de direcciones diferente o en una máquina remota. También puede ser responsable de codificar la solicitud y sus argumentos y enviar la solicitud codificada al "Sujeto" real.
- Proxy virtual (proxies virtuales): asegura que el "Sujeto" real se crea solo cuando realmente se necesita. También puede almacenar en caché parte de la información sobre el "sujeto" real para retrasar su creación.
- Copy-on-write : Proporciona una copia del "asunto" cuando el cliente realiza determinadas acciones (un caso especial del "proxy virtual").
- Proxies de protección : Puede verificar si la persona que llama tiene los permisos necesarios para realizar la solicitud.
- Caching Proxy : proporciona almacenamiento temporal de los resultados de los cálculos antes de entregarlos a varios clientes que pueden compartir los resultados.
- Screening Proxy: Protege al "Sujeto" de clientes peligrosos (o viceversa).
- Proxy de sincronización : realiza el control de acceso sincronizado al "Sujeto" en un entorno asíncrono de subprocesos múltiples.
- Enlace “inteligente” (smart reference proxy): realiza acciones adicionales cuando se crea un enlace al “Asunto”, por ejemplo, calcula el número de enlaces activos al “Asunto”.
2.4 Puente
El patrón Bridge es un patrón de diseño estructural que se utiliza para "separar la abstracción y la implementación para que puedan cambiar de forma independiente".
El patrón de puente usa encapsulación, agregación y puede usar herencia para compartir la responsabilidad entre clases.

Cuando la abstracción y la implementación están separadas, pueden cambiar de forma independiente. En otras palabras, cuando se implementa a través del patrón de puente, cambiar la estructura de la interfaz no interfiere con el cambio de estructura de la implementación.
Considere tal abstracción como una figura. Hay muchos tipos de formas, cada una con sus propias propiedades y métodos. Sin embargo, hay algo que une a todas las figuras. Por ejemplo, cada forma debe poder dibujarse a sí misma, escalar, etc.
Al mismo tiempo, los gráficos de dibujo pueden diferir según el tipo de sistema operativo o biblioteca de gráficos. Las formas deben poder dibujarse a sí mismas en varios entornos gráficos. Pero no es práctico implementar todos los métodos de dibujo en cada forma, o modificar la forma cada vez que cambia el método de dibujo.
En este caso, el patrón de puente ayuda, permitiéndole crear nuevas clases que implementarán el dibujo en varios entornos gráficos. Con este enfoque, es muy fácil agregar nuevas formas y formas de dibujarlas.
La conexión representada por la flecha en los diagramas puede tener 2 significados: a) “un tipo”, de acuerdo con el principio de sustitución de Liskov, yb) una de las posibles implementaciones de la abstracción. Los idiomas suelen utilizar la herencia para implementar tanto a) como b), lo que tiende a inflar las jerarquías de clases.
El puente sirve exactamente para resolver este problema: los objetos se crean en pares a partir de un objeto de una clase de jerarquía A y jerarquía B, la herencia dentro de la jerarquía A tiene el significado de "variedad" según Liskov, y para el concepto de "implementación de abstracción” se utiliza un enlace del objeto A a su objeto B emparejado.
2.5 Fachada
El patrón Facade es un patrón de diseño estructural que oculta la complejidad de un sistema al reducir todas las llamadas externas posibles a un solo objeto que las delega a los objetos apropiados en el sistema.

¿Cómo proporcionar una interfaz unificada con un conjunto de implementaciones o interfaces dispares, por ejemplo, a un subsistema, si no se desea un fuerte acoplamiento a ese subsistema, o si la implementación del subsistema podría cambiar?
Defina un punto de interacción con el subsistema: un objeto de fachada que proporcione una interfaz común con el subsistema y asígnele la responsabilidad de interactuar con sus componentes. Una fachada es un objeto externo que proporciona un único punto de entrada para los servicios del subsistema.
La implementación de otros componentes del subsistema es privada y no es visible para los componentes externos. El objeto de fachada proporciona una implementación del patrón GRASP resistente a los cambios en términos de protección contra cambios en la implementación del subsistema.
¡Importante! Este patrón se utiliza cuando queremos ocultar por completo algún grupo de objetos y pasar toda la comunicación con ellos a través de nuestro objeto. Si solo desea proporcionar cierto control sobre el proceso de comunicación de los objetos y no necesariamente ocultarlos, entonces es mejor usar el patrón Proxy.
GO TO FULL VERSION