Patrones de diseño. Facade Pattern

Introducción

El patrón Façade es un patrón de software cuyo objetivo se basa en simplificar o hacer más amigable la complejidad asociada a una librería software.

En ocasiones una librería o serie de librerias 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 convieniente crear un objeto que simplifica el API de la librería, unificando y simplicando ciertos procesos del API. Por supuesto algunos programas todavía querran (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 comunmente usada de la librería.

Problema

El patrón Façade aborda el problema de simplicación (o limpieza) de interfaces en librerías de programación para presentar interfaces simplificados para las funciones más comunes.

Aplicabilidad

El uso de este patrón esta recomendado para

  • Simplicar el uso y comprensión de una librería software.
  • Encapsular un interfaz de librería poco amigable en un interfaz más coherente o mejor estructurado.
  • Centralizar las dependencias externas hacia la librería en uno o pocos puntos de entrada.

Estructura

Facade Pattern.png

Código de ejemplo

Para ver un ejemplo simple vamos a suponer el caso en el que tenemos una librería gráfica que nos permite dibujar distintos elementos en pantalla tales como lineas, puntos, bitmaps. Supongamos que parte del interfaz de la librería es como sigue (se incluyen solo las cabeceras):

public class CBitMapStream : CStream
{
  public CBitMapStream(string filename);
}

public class CBitmap
{
  public enum TMaskType = {mskNone, mskBW, mskInvert}
  public CBitmap();
  public CargarStream(CBitmapStream stream);  
}

public class CDrawer
{
  public DibujarBitmap(CBitmap bitmap, int x, int y, double AspectRatio);
}

Sobre dicho código se superpone un Façade como el siguiente

public class DrawHelper
{
  private CDrawer mDrawer = new CDrawer();

  public CDrawer Drawer
  {
    get { return mDrawer; }
  }

  public DibujarBitmap(string filename; int x, int y)
  {
    CBitMapStream bStream = new CBitMapStream(filename);
    CBitMap bitmap = new CBitMap;
    bitmap.CargarStream(bStream);
    double aspectRatio = Screen.Width / Screen.Height;
    mDrawer.DibujarBitmap(bitmap, x, y, aspectRatio);
  }
}

De esta forma una operación común como puede ser leer un bitmap de fichero y pintarlo en pantalla con el aspect ratio normal (es decir una de las operaciones más comunes a realizar) se puede realizar por parte del cliente como una simple llamada a:

foreach (CIcono in ListaIconos) do
  DrawHelper.DibujarBitmap(CIcono.FileName, CIcono.XPos, CIcono.YPos);

Haciendo el código del cliente no solo mucho más simple sino también mucho más legíble.

Ejemplos reales

El patrón Façade es común en numerosas librerias de software, tanto comerciales como libres y su utilización esta 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 estandar de Java que proporcionan la funcionalidad básica para manipulación de fuentes y graficos 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.

6.66667
Average: 6.7 (6 votes)
Your rating: None