Diyelim ben bir hiyerarşi var ki Itemsı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 DrawManagerlistesini alan Itemve 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 ItemDrawerhiyerarşiye ( RectangleDrawervb.) 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?