Angenommen, ich habe eine Hierarchie von Item
Klassen : Rectangle, Circle, Triangle
. Ich möchte sie zeichnen können, daher besteht meine erste Möglichkeit darin Draw()
, jedem eine virtuelle Methode hinzuzufügen :
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
Ich möchte jedoch die Zeichnungsfunktionalität in eine separate Zeichnungsbibliothek aufteilen, während die Kernbibliothek nur die grundlegenden Darstellungen enthält. Ich kann mir einige Möglichkeiten vorstellen:
1 - A DrawManager
, das eine Liste von Item
s erstellt und verwenden muss dynamic_cast<>
, um herauszufinden, was zu tun ist:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
Dies ist nicht ideal, da es auf RTTI basiert und eine Klasse dazu zwingt, alle Elemente in der Hierarchie zu kennen.
2 - Der andere Ansatz besteht darin, die Zeichnungsverantwortung auf eine ItemDrawer
Hierarchie ( RectangleDrawer
usw.) zu verschieben:
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
Dadurch wird die Trennung von Bedenken zwischen der Basisdarstellung der Elemente und dem Code zum Zeichnen erreicht. Das Problem ist jedoch, dass die Elementklassen von den Zeichnungsklassen abhängig sind.
Wie kann ich diesen Zeichnungscode in eine separate Bibliothek aufteilen? Ist die Lösung für die Artikel, eine Factory-Klasse mit einer Beschreibung zurückzugeben? Wie kann dies jedoch definiert werden, damit die Core-Bibliothek nicht von der Draw-Bibliothek abhängig ist?