Facade (Fachada)
El propósito de este patrón de diseño es proveer una interfaz unificada para simplificar el acceso a un conjunto de interfaces y clases de un subsistema o librería. Facade define una interfaz a un mayor nivel de abstracción que facilita el uso de un subsistema más complejo.
La estructura del patrón es la siguiente:
Aunque el propósito principal de este patrón es abstraer la complejidad de subsistema o librearía (usualmente desarrollado por terceros), también puede ser útil cuando trata de facilitar el uso de código con un diseño deficiente de manera tal que la funcionalidad puede seguir siendo consumida mientras se mejora el diseño.
Finalmente, es importante mencionar que este patrón no busca en sí mismo decorar o extender la funcionalidad del subsistema que abstrae.
Adapter (Adaptador)
El propósito de este patrón es convertir la interfaz de un componente en una interfaz esperada por el cliente. Adapter permite que clases con interfaces incompatibles puedan colaborar.
La estructura del patrón es la siguiente:
Este patrón se emplea cuando un cliente no puede consumir directamente los servicios de una clase y no es conveniente o posible cambiar el código del cliente; en este escenario, es más conveniente crear un adaptador entre el cliente y la clase que cambiar el cliente. Por ejemplo, si se ha desarrollado un sistema que realiza cálculos con la temperatura en grados Celsius y hemos contratado un servicio que en ciertas circunstancias devuelve grados Fahrenheit, es más conveniente crear un adaptador que realice las conversiones necesarias que modificar el sistema para operar con grados Celsius.
Tanto Facade como Adapter realizan un rol de intermediación entre el cliente y clases cuya funcionalidad es requerida por el cliente pero buscan propósitos diferentes: Facade busca facilitar el uso de un subistema proveyendo una interfaz más simple, Adapter busca cambiar la interfaz de una clase a una que espera el cliente evitando así tener que cambiar el cliente.
Referencias
[1] Design Patterns: Elements of Reusable Object-Oriented Software
Comments are closed.