Facade

Facade
Información sobre la plantilla
Facade.jpg
Concepto:Proporcione una interfaz unificada a un juego de interfaz en un subsistema.

Facade o fachada: Este patrón se utiliza para proporcionar una interfaz unificada de alto nivel para un conjunto de clases en un subsistema, lo que permite una mayor facilidad de uso. Simplifica el acceso a dicho conjunto de clases, ya que el cliente sólo se comunica con ellas a través de una única interfaz.

El patrón Fachada viene motivado por la necesidad de estructurar un entorno de programación y reducir su complejidad con la división en subsistemas, minimizando las comunicaciones y dependencias entre éstos.

Tipo

Estructura, a nivel de objetos.

Propósito

Proporcionar una interfaz unificada de alto nivel que, representando a todo un subsistema, facilite su uso. La Fachada satisface a la mayoría de los clientes, sin ocultar las funciones de menor nivel a aquellos que necesiten acceder a ellas.

Participantes

  • Fachada (el recopilador), conoce qué clases del subsistema son responsables de una determinada petición, y delega esas peticiones de los clientes a los objetos apropiados del subsistema.
  • Subclases, clasificada en: (el Escáner, Parser, ProgramNode, etc.), Implementa la funcionalidad del subsistema. trabajo del asa asignado por el objeto de la Fachada. No tiene ningún conocimiento de la fachada; es decir, ellos no guardan ninguna referencia a ella.

Cuando usarlo

  • Cuando se pretende proporcionar una interfaz simple para un subsistema complejo.
  • Cuando existen muchas dependencias entre los clientes y las clases que implementan una abstracción. Una Fachada proporciona al subsistema independencia y portabilidad.
  • Cuando se pretende estructurar en capas el subsistema (cada capa tendrá su propia Fachada).

Consecuencias

Las consecuencias más importantes como resultado de la aplicación de este patrón vienen dada en la reducción del acoplamiento entre clientes y subsistemas (consiguiendo que los cambios de las clases del sistema sean transparentes a los clientes) y el aislamiento de cambios en la implementación. También oculta a los clientes la complejidad del subsistema, facilitando su uso sin impedir el acceso a las clases del subsistema en caso necesario. Además, facilita la división en capas y reduce dependencias de compilación.

Ventajas e Inconvenientes

  • Al separar al cliente de los componentes del subsistema, se reduce el número de objetos con los que el cliente trata, facilitando así el uso del subsistema.
  • Se promueve un acoplamiento débil entre el subsistema y sus clientes, eliminándose o reduciéndose las dependencias.
  • No existen obstáculos para que las aplicaciones usen las clases del subsistema que necesiten. De esta forma podemos elegir entre facilidad de uso y generalidad.
  • Como inconveniente, se tiene considerar el caso en que varios clientes necesiten acceder a subconjuntos diferentes de la funcionalidad que provee el sistema, podrían acabar usando sólo una pequeña parte de la fachada, por lo que sería conveniente utilizar varias fachadas más específicas en lugar de una única global.

Relacionado con

  • Fábrica Abstracta puede usarse conjuntamente con Fachada para proporcionar una interfaz que permita crear objetos del subsistema de manera independiente a éste. Además, puede ser una alternativa para ocultar las clases específicas de una plataforma.
  • Mediador es similar a Fachada pues también abstrae la funcionalidad de clases ya existentes, pero está orientado a la comunicación entre objetos "colegas" y además suele centralizar aquellas responsabilidades que no competen a ninguno de ellos. Por su parte, como hemos visto, Fachada abstrae la interfaz de un subsistema para facilitar su uso, sin añadir funcionalidades y resultando transparente a éste.

Lo más frecuente es que sólo haya un objeto Fachada de cada tipo. De ahí su relación con Solitario.

Otros aspectos de interés

  • La "Fachada" sabe qué clase es responsable de cada petición, pero es completamente transparente para ellas. Por tanto, aunque las funciones las desempeñan las otras clases, es a la Fachada a quien le toca el trabajo de "traducir".
  • Una manera de reducir el acoplamiento es hacer abstracta la Fachada y luego especializar mediante herencia. Otra posibilidad es configurar la Fachada con objetos del subsistema, que pueden cambiarse. Esta posibilidad puede entrar en conflicto con el objetivo de la Fachada, la facilidad de uso.
  • Un subsistema es análogo a una clase, en el sentido de que tiene una interfaz pública (de la que forma parte la Fachada) y otra privada (que no está muy claro como conseguirla ni para que sirve).

Ejemplo de aplicación

En un entorno de programación se permite a las aplicaciones el acceso al subsistema de compilación. Este subsistema contiene clases como el Analizador Léxico, el Analizador Sintáctico, el Analizador Semántico, el Generador de código intermedio o el Generador de código final. No obstante sólo aplicaciones muy especiales necesitan acceder directamente a algunas de estas clases, mientras que para el resto se puede definir una interfaz general, una Fachada, que les permita sencillamente compilar sus programas.

Fuentes

  • Patrones del "Gang of Four". Unidad Docente de Ingeniería del Software Facultad de informática - Universidad Politécnica de Madrid
  • DesingPatterns.chm.
  • André Weinand, Erich Gamma, and Rudolf Marty. ET++ — An object-oriented application framework in C++. In Object-Oriented Programming Systems, Languages, and Applications Conference Proceedings, pages 46–57, San Diego, CA, September 1988. ACM Press.
  • Bjarne Stroustrup. The Design and Evolution of C++. Addison-Wesley, Reading, MA, 1994.
  • http://userpages.umbc.edu/~tarr/dp/lectures/Facade-2pp.pdf