Digamos que tengo una jerarquía de Item
clases: Rectangle, Circle, Triangle
. Quiero poder dibujarlos, así que mi primera posibilidad es agregar un Draw()
método virtual a cada uno:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
Sin embargo, quiero dividir la funcionalidad de dibujo en una biblioteca Draw separada, mientras que la biblioteca Core contiene solo las representaciones básicas. Hay un par de posibilidades en las que puedo pensar:
1 - A DrawManager
que toma una lista de Item
sy tiene que usar dynamic_cast<>
para determinar qué hacer:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
Esto no es ideal, ya que se basa en RTTI y obliga a una clase a conocer todos los elementos de la jerarquía.
2 - El otro enfoque es diferir la responsabilidad del dibujo a una ItemDrawer
jerarquía ( RectangleDrawer
, etc.):
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
Esto logra la separación de preocupaciones entre la representación base de los Artículos y el código para dibujar. Sin embargo, el problema es que las clases de ítems dependen de las clases de dibujo.
¿Cómo puedo separar este código de dibujo en una biblioteca separada? ¿Es la solución para que los artículos devuelvan una clase de fábrica de alguna descripción? Sin embargo, ¿cómo se puede definir esto para que la biblioteca Core no dependa de la biblioteca Draw?