design patterns - intermediario - ¿Cuál es la diferencia entre los patrones de diseño Facade y Gateway?
patron diseño flyweight (11)
o Fachada == Puerta de enlace?
Al revisar Facade en el libro GoF y el enlace en otra respuesta a Martin Fowler''s Gateway, parece que su enfoque está en direcciones opuestas.
Facade proporciona una vista simple y uniforme de internos complejos a (uno o más) clientes externos;
Gateway proporciona una vista simple y uniforme de los recursos externos a las partes internas de una aplicación.
Esta distinción nos permite enfocarnos en cuál es más importante en un diseño:
Con Facade, el sistema externo es nuestro cliente; es mejor agregar complejidad hacia adentro si hace que la interfaz externa sea más simple.
Con Gateway, el sistema interno es nuestro cliente; dale toda la ayuda que podamos, incluso si lo externo es más complejo.
Aquí está la cita directa del libro de Fowler:
Si bien Facade simplifica una API más compleja, generalmente la realiza el escritor del servicio para uso general. El cliente escribe una puerta de enlace para su uso particular. Además, una fachada siempre implica una interfaz diferente a lo que cubre, mientras que una puerta de enlace puede copiar la fachada envolvente por completo, siendo utilizada para fines de sustitución o prueba.
[Capítulo 18]
Creo que Gateway es un caso específico de Facade, una fachada sobre un sistema externo.
En pocas palabras, Facade es un patrón de diseño, mientras que Gateway es un patrón arquitectónico.
Application Gateway, por ejemplo, es un patrón de arquitectura de infraestructura. El nodo reside en DMZ y aísla los nodos internos de los clientes externos que solo pueden conectarse a la puerta de enlace de la aplicación.
Cuando piense en patrones de arquitectura, piense en los nodos. Cuando piense en patrones de diseño, piense en clases / objetos.
El nodo es una abstracción de: dispositivo: material de hardware y software del sistema, por ejemplo, sistema operativo, plataforma / marco, etc. El software del sistema está "asignado" al dispositivo. El nodo "encapsula" tanto el dispositivo como el software del sistema y está relacionado con otros nodos que comprenden la arquitectura.
Gateway es un nodo que aísla los nodos del servidor de los nodos del cliente: el nodo del cliente no se puede conectar directamente a un nodo del servidor. Gateway recibe la conexión y luego establece la conexión misma al nodo de destino.
Esto podría ser algo simplificado, pero aquí está mi opinión.
- Al usar el patrón Fachada, proporciona la interfaz que otros pueden usar para hablar con su aplicación. Ejemplo: Ha implementado una aplicación que tiene varios "módulos", para facilitar el acceso a los "módulos" puede crear una Fachada para facilitar la interacción con los módulos ... un único punto de contacto.
- Al usar el patrón Gateway, encapsula una parte externa que desea usar. Ejemplo: desea utilizar el registro, pero no desea vincularlo a un marco de registro específico, en ese caso puede definir su puerta de enlace que define la funcionalidad que desea usar y dejar que la puerta de enlace maneje la interacción con el marco de registro que desea utilizar. Esto hace que sea fácil cambiar el marco de registro en el futuro.
Estos dos patrones son muy similares en la forma en que ambos sirven como envoltorios sobre algo . La diferencia está en el contexto : la fachada se encuentra sobre un grupo de subsistemas, mientras que la puerta de enlace puede estar sobre cualquier funcionalidad. Desde este punto de vista, para mí Facade es el caso concreto de Gateway (no opuesto).
Fachada se aplica cuando pensamos que trabajar con subsistemas es complejo o si queremos agrupar varias llamadas de subsistema en una ejecución de [método]. Sin embargo, esto no significa necesariamente que los subsistemas no sean accesibles, o que sean lo suficientemente complejos. Simplemente significa que tenemos subsistemas.
Gateway se aplica cuando queremos envolver algunas cosas y exponerlas de manera diferente. Gateway puede estar envolviendo no un subsistema, sino simplemente una funcionalidad relativamente compleja. Gateway es un patrón general que puede considerarse como una base para Facade, Proxy y otros patrones.
Si aún se necesita un ejemplo para la aclaración :
Facade puede calcular la solvencia crediticia de un cliente al consultar el subsistema de cuentas corrientes, el subsistema de cuentas de crédito, el subsistema de ahorro y el subsistema de back office (creo que he visto ejemplos similares en los libros de GOF).
class MortgateFacade {
bool IsCreditWorth(string customerName) {
return !_checkingAccSystem.HasNegativeBalance(customerName) && !_creditAccSystem.HasNegativeCredit(customerName) && !_backOfficeSystem.IsInBlackList(customerName);
}
}
Gateway puede consultar la tabla de la base de datos y devolver al cliente por ID. (Sí, así de simple!)
class CustomersGateway {
Customer GetCustomer(int id) {
return _db.ExecuteOne("SELECT TOP 1 FROM CUSTOMERS WHERE CUSTOMER_ID="+id).AsCustomer();
}
}
[Obviamente esto es un pseudo código]
Fachada utilizada para trabajar con el gráfico de algún objeto como con un solo objeto y puerta de enlace para conectar dos módulos / sistemas diferentes.
Para responder a su pregunta, no diría que Fachada == Puerta de enlace, sino esa Fachada-Puerta de entrada. Con eso quiero decir que son aproximadamente iguales, la forma en que difieren no es aparentemente clara en función de las opiniones divergentes anteriores.
Debe recordar que uno de los componentes clave de los patrones de diseño y la terminología en general es ayudar a comunicar sus ideas con mayor facilidad. Con eso se dice que si siempre hablas en términos de una fachada tendrás una mayor posibilidad de ser entendido, ya que es el término que se utiliza con más frecuencia.
The Intent of Facade viene dado por http://c2.com/cgi/wiki?FacadePattern como
Proporcionar una interfaz unificada para un conjunto de interfaces en un subsistema. Facade define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar. Esto se puede usar para simplificar varias interacciones de objetos complicadas en una sola interfaz.
El objetivo aquí es diseñar una interfaz que oculte la complejidad, y creo que la idea clave es ocultar múltiples interacciones finas en una sola interacción más utilizable. Por lo tanto, el foco de Facade está orientado al cliente.
El patrón de puerta de enlace no es uno de los patrones GOF originales, y lo veo más como un patrón de integración empresarial, es decir, en un nivel bastante superior al de la fachada. Ver la definition de Fowler
Considero que Gateway se trata principalmente de ocultar la complejidad tecnológica en lugar de la complejidad de la interfaz, ocultando los detalles de la conexión a mainframes y sistemas externos. De hecho, a menudo espero que la puerta de enlace se convierta en algo así como un enrutador de solicitud, tal vez incluso seleccionando diferentes sistemas back-end sobre la base de los detalles de la solicitud. Entonces veo que Gateway se enfoca en las cosas a las que es una puerta de entrada.
Obviamente, informalmente, Gateway es una fachada, ya que oculta detalles, pero creo que cuando implementas una GOF Facade y una Fowler Gateway terminas haciendo cosas muy diferentes.
Tiendo a pensar en muchos patrones a partir de casos especiales de patrón de Proxy, y no me preocupo mucho por cuál específicamente sea.
Es decir:
Facade es tu proxy simple para un grupo de clases complicadas.
El adaptador es un proxy para partes del sistema con interfaces incompatibles como la que necesitamos en este momento
etc ...
A juzgar por lo que he encontrado en una búsqueda en Google de "patrón de puerta de enlace", parece que Gateway == Proxy: D
Un valor principal de patrón de fachada es '' simplificar '' el uso de componentes internos (detrás de la fachada). Podría ser que un punto de entrada o función en la fachada usará múltiples funciones de los componentes internos. Si una puerta de enlace está brindando el mismo valor de '' simplificar '' el uso de las API o los componentes que están detrás de ella, podría considerarse una fachada. En otras situaciones, una puerta de enlace podría ser simplemente un middleware, adaptador, envoltura o un elemento de reenvío de llamadas de la arquitectura. O una puerta de enlace podría llevar múltiples sombreros, como la simplificación de algunos flujos, el reenvío de algunas llamadas mientras actúa como un middleware de autenticación o autorización en paralelo también. Por lo tanto, la puerta de enlace IMHO es un patrón altamente abstracto que podría abarcar uno o más patrones estructurales específicos como fachada, adaptador, envoltura, decorador o middleware, etc.
La definición de Martin Fowler de gateway es de naturaleza estrecha (al menos la que está here ) y está más cerca de las API Gateways que actúan como decoradores de formato.
En lo que respecta a la implementación, no hay límite en lo que las pasarelas podrían y no podrían hacer. Es prácticamente una aplicación propia y podría ofrecer cualquier funcionalidad.