17 enero 2006

Patrón fachada

Supongamos que tenemos una librería gráfica similar a la que tengo en mi página.

En ella hay una clase Lienzo que es la zona de dibujo para dibujar. Hay una clase EscalaGrafica que es la encargada de hacer las conversiones de coordenadas deseadas para el gráfico a coordenadas de pixels de pantalla y viceversa. Esta clase se encarga, por ejemplo, de hacer las cuentas para que un Lienzo con 100 pixels de ancho tenga unos valores de x que van de -PI a +PI para dibujar una función sin(x). También hay una clase Rejilla para dibujar unos ejes y un cuadriculado. Hay una clase Mano para permitir arrastrar con el ratón un gráfico. Hay unas clases de botonería de zoom para poder hacer zoom en el gráfico. También hay unas clases Cursor que al pasear el ratón por encima del gráfico nos van diciendo las coordenadas del gráfico en las que estamos, aparte de permitir dejar unas marcas en el gráfico.

Ahora supongamos que vamos a hacer un programa matemático en el que tenemos una interface de usuario y en ella hay unos 200 gráficos. Todos ellos son de funciones matemáticas y queremos que tengan un aspecto similar. Todos pintarán una función matemática, llevarán una rejilla, unos botones de zoom y una mano que permita arrastrar el gráfico.

Para hacer cada uno de estos gráficos debemos hacer los siguientes pasos:
  • Instanciar la clase Lienzo.
  • Instanciar la clase EscalaGrafica que convierte coordenadas a pixels y meterla en la clase Lienzo.
  • Instanciar la clase Rejilla y meterla en Lienzo.
  • Instanciar la clase Mano y meterla en Lienzo.
  • Instanciar los botones de zoom, pasarles la EscalaGrafica y ponerlos en un contenedor junto al Lienzo.
  • Finalmente, el paso que es especifico de cada grafico, que es instanciar el ObjetoGrafico que representa la funcion matemática que queremos pintar y meterlo en el Lienzo.
Vemos que hay un montón de pasos que son comunes a todos los gráficos. Son comunes todos excepto el último, en el que la función será la que sea. También vemos que hay un pequeño berenjenal de clases e inicializaciones entre ellas.

El patrón fachada nos dice que podemos hacer una clase que nos oculte toda esta complejidad. La clase puede ser GraficoDeFuncion, que sea un contenedor (un JPanel java) que dentro instancie el Lienzo, la botonería de Zoom, la Mano, la EscalaGrafica y la Rejilla. Lo inicialice y lo coloque todo en su sitio. Únicamente habría que pasarle desde fuera la función matemática que queramos y si acaso los valores extremos de coordenadas (de -PI a PI para x y de -1 a 1 para y si queremos pintar un sin(x), por ejemplo).

De esta forma, en nuestra aplicación, iremos instanciando clases GraficoDeFuncion que son más fáciles de inicilizar.

En resumen, el patrón fachada consiste en crear una única clase de manejo más fácil que nos permita acceder a un conjunto más o menos numeroso y complicado de clases que necesitan una inicialización compleja. Quizás no nos deja hacer todo lo que se podría hacer con las clases sueltas (por ejemplo, no poner Mano a un gráfico o ponerle una botonería de zoom distinta a las demás), pero nos ahorra mucho el trabajo de instanciación e inicialización de todo eso.

1 comentario:

Anónimo dijo...

bonito ejemplo ;) bien explicado y detallado