lunes, 10 de diciembre de 2012

Patrón de software - Visitor


Patrón de software - Visitor


Muchas veces, cuando queremos mostrar un ejemplo de programación orientada a objetos, se sale con el ejemplo de dibujar en pantalla diferentes figuras, como triangulos, cuadros y circulos. Que si estamos programando en C# pasaremos un objeto Graphics para su dibujado y ya está, ya que cada objeto tendrá su posición. Y de esta forma, usaríamos el poliformismo.

En este ejemplo, tendremos, como todos sabemos, una clase abstracta Figura y las clases hijas, Triangle, Square y Circle.

Pero, ¿qué pasa cuando el rectangulo representa una zona de una ciudad, es decir, sus medidas están en metros?. Ya no se podrá dibujar un rectangulo de 100x100 metros, habrá que escalar las medidas a pixeles.
¿pero donde se hace esa transformación? ¿en las clases hijas?¿la del padre?

Creo que una forma sería tener una clase, en este caso, FigureView, donde tendría la responsabilidad de dibujar y de guardar todas las figuras. Y el metodo dibujar sería


void Draw(Graphcis g)
{
foreach(Figure figure in _figures)
{
       f.Draw(g,this);
}
}

aquí le pasamos el this, el objeto a un objeto FigureView que será el Visitor del patrón de diseño.

ya que luego el metodo Draw de Triangle será:

void Draw(Graphics g,FigureView view)
{
     view.Draw(g,this);
}

Y aquí, viene la importante, las clases hijas llamaran a los siguientes métodos sobrecargados de FigureView:

void Draw(Grapchis, Triangle t);
void Draw(Grapchis, Circle c);
void Draw(Grapchis, Square s);

así, se deja en FigureView la responsabilidad de dibujar, y hacer los cálculos en la escala que precise.

y también importante, en un solo bucle, podemos dibujar las distintas figuras que conforman la vista.

saludos y happy coding!


No hay comentarios:

Publicar un comentario