Diyelim ben bir hiyerarşi var ki Item
sınıflar: Rectangle, Circle, Triangle
. Onları çizmek istiyorum, bu yüzden ilk olasılık Draw()
her birine sanal bir yöntem eklemek :
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
Ancak, Çekirdek kitaplığı yalnızca temel gösterimleri içerirken çizim işlevselliğini ayrı bir Draw kitaplığına bölmek istiyorum. Düşünebileceğim birkaç olasılık var:
1 - Bir s DrawManager
listesini alan Item
ve dynamic_cast<>
ne yapılacağını bulmak için kullanması gereken bir:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
RTTI'ye bağlı olduğu ve bir sınıfı hiyerarşideki tüm öğelerden haberdar olmaya zorladığı için bu ideal değildir.
2 - Diğer yaklaşım, çizim sorumluluğunu bir ItemDrawer
hiyerarşiye ( RectangleDrawer
vb.) Ertelemektir:
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
Bu, Maddelerin temel temsili ile çizim kodu arasındaki endişelerin ayrılmasını sağlar. Ancak sorun Item sınıflarının çizim sınıflarına bağımlı olmasıdır.
Bu çizim kodunu ayrı bir kütüphaneye nasıl ayırabilirim? Maddelerin bir tanımın fabrika sınıfına dönmesi için bir çözüm mü? Ancak, çekirdek kitaplığın Draw kitaplığına bağımlı olmaması için bu nasıl tanımlanabilir?