Patrón de Diseño: Facade

ABSTRACT— The Facade pattern is a software engineering design pattern commonly used with Object-oriented programming.
A facade is an object that provides a simplified interface to a larger body of code, such as a class library. A facade can:
• Make a software library easier to use and understand, since the facade has convenient methods for common tasks;
• Make code that uses the library more readable, for the same reason;
• Reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system;
• Wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).
An Adapter is used when the wrapper must respect a particular interface and must support a polymorphic behavior. On the other hand, a facade is used when one wants an easier or simpler interface to work with


INTRODUCCION

En ocasiones una librería o serie de librerías contienen una serie de funcionalidades para realizar diversas acciones. Si se analiza, en la gran mayoría de los proyectos de software, se observará que la mayor parte de las llamadas que recibe la librería es a las mismas funciones o a una combinación de ellas. Es decir, existe una gran cantidad de peticiones comunes que suelen ocurrir en el 90% de los casos y que satisfacen las necesidades del cliente de la librería. En estos casos, es conveniente crear un objeto que simplifica el API de la librería, unificando y simplificando ciertos procesos del API, para lo cual nos sirve el uso del patrón facade. Por supuesto algunos programas todavía querrán (y podrán) acceder al viejo API de la librería para utilizar algunas funciones especializadas pero se habrá conseguido simplificar la funcionalidad más comúnmente usada de la librería.
I. PATRÓN DE DISEÑO: FACADE

A continuación se encuentra la plantilla del patrón objeto de estudio:

1. Nombre del patrón: Facade.

2. Clasificación del patrón: Estructural.

3. Intención: Suministra una interfaz unificada para un conjunto de interfaces en un subsistema. Facade define un alto nivel de interfaz que hace al subsistema fácil de usar.

4. También conocido como: Facade.

5. Motivación:

• Reducir la complejidad y minimizar dependencias



• Estructurar un entorno de programación


6. Aplicabilidad:

Este patrón se usa cuando:

• Se quiera proporcionar una interfaz sencilla para un subsistema complejo.
• Se quiera desacoplar un subsistema de sus clientes y de otros subsistemas, haciéndolo más independiente y portable.
• Se quiera dividir los sistemas en niveles: las fachadas serían el punto de entrada a cada nivel.

Problemas que soluciona:

•Problema: Un cliente necesita acceder a parte de la funcionalidad de un sistema más complejo.
 Definir una interfaz que permita acceder solamente a esa funcionalidad.

•Problema: Existen grupos de tareas muy frecuentes para las que se puede crear código más sencillo y legible.
 Definir funcionalidad que agrupe estas tareas en funciones o métodos sencillos y claros.


•Problema: Una biblioteca es difícilmente legible.
 Crear un intermediario más legible.

•Problema: Dependencia entre el código del cliente y la parte interna de una biblioteca.
 Crear un intermediario y realizar llamadas a la biblioteca sólo o, sobre todo, a través de él.

•Problema: Necesidad de acceder a un conjunto de APIs, que pueden, además, tener un diseño no muy bueno.
 Crear una API intermedia, bien diseñada, que permita acceder a la funcionalidad de las demás.


7. Estructura:




8. Participantes:

•Fachada: delegar las peticiones de los clientes en los objetos del subsistema.
•Clases del subsistema: implementar la funcionalidad del subsistema.

9. Colaboraciones:

•Los clientes se comunican con el subsistema a través de la fachada, que reenvía las peticiones a los objetos del subsistema apropiados y puede realizar también algún trabajo de traducción.
•Los clientes que usan la fachada no necesitan acceder directamente a los objetos del sistema.

10. Consecuencias:

•Oculta a los clientes de la complejidad del subsistema y lo hace más fácil de usar.
•Favorece un acoplamiento débil entre el subsistema y sus clientes, consiguiendo que los cambios de las clases del sistema sean transparentes a los clientes.
•Facilita la división en capas y reduce dependencias de compilación.
•No se impide el acceso a las clases del sistema.

11. Implementación:

•Se puede reducir aún más el acoplamiento haciendo que la fachada sea una clase abstracta, de forma que se pueda escoger entre distintas implementaciones del subsistema.
•Java y las últimas versiones de C++ facilitan la definición de clases privadas a un subsistema.

12. Usos Conocidos:
El patrón Façade es común en numerosas librerías de software, tanto comerciales como libres y su utilización está más o menos bastante generalizada en gran parte de las librerías software.
Algunos ejemplos concretos son las clases Font y Graphics de las librerías estándar de Java que proporcionan la funcionalidad básica para manipulación de fuentes y gráficos aislando al usuario, en las operaciones más comunes, de la complejidad subyacente. Otros ejemplos incluyen determinados interfaces de librerías GIS o librerías matemáticas.

13. Patrones relacionados:

•Las fachadas suelen ser singletons
•Indirección (Patrón GRASP).
•Controlador (Patrón GRASP). Los controladores suelen actuar como puntos de entrada (fachadas) de la capa lógica.



REFERENCIAS
[1] García Pérez Baltasar. Desarrollo rápido de aplicaciones. Versión PDF.
[2] Orjuela Luz Marina. Modelos de Programación: Patrones GOF 10. Universidad Distrital Francisco José de Caldas. 2006.
[3] Cuesta Carlos E. Patrones de Diseño. Ingeniería de software I. Universidad Rey Juan Carlos. Versión PDF.
[4] Introducción a los Patrones de Diseño- Facade. Ingeniería de software II. Universidad de Sevilla. Versión PDF.
[5] Mazzini Daniel. Patrones de Diseño. Versión PDF
[6] http://en.wikipedia.org/wiki/Facade_pattern
[7] http://www.javaworld.com/columns/jw-java-design-patterns-index.html
[8] http://www.stackframe.net/es/content/11-2008/patrones-de-diseno-facade-pattern
[9] http://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)