मान लीजिए कि मेरे पास Item
कक्षाओं का एक पदानुक्रम है Rectangle, Circle, Triangle
:। मैं उन्हें आकर्षित करने में सक्षम होना चाहता हूं, इसलिए मेरी पहली संभावना Draw()
प्रत्येक के लिए एक आभासी विधि जोड़ना है :
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
हालांकि, मैं ड्राइंग कार्यक्षमता को एक अलग ड्रॉ लाइब्रेरी में विभाजित करना चाहता हूं, जबकि कोर लाइब्रेरी में केवल मूल प्रतिनिधित्व शामिल हैं। संभावनाओं का एक जोड़ा है जिसके बारे में मैं सोच सकता हूं:
1 - एक है DrawManager
कि Item
एस की एक सूची लेता है और dynamic_cast<>
काम करने के लिए उपयोग करने के लिए क्या करना है:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
यह आदर्श नहीं है क्योंकि यह RTTI पर निर्भर करता है और एक वर्ग को पदानुक्रम में सभी वस्तुओं के बारे में जागरूक करने के लिए मजबूर करता है।
2 - अन्य दृष्टिकोण एक ItemDrawer
पदानुक्रम ( RectangleDrawer
, आदि) के लिए आरेखण जिम्मेदारी को स्थगित करना है :
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
यह वस्तुओं के आधार प्रतिनिधित्व और ड्राइंग के लिए कोड के बीच चिंताओं के अलगाव को प्राप्त करता है। हालांकि समस्या यह है कि आइटम वर्ग ड्राइंग कक्षाओं पर निर्भर हैं।
मैं इस ड्राइंग कोड को अलग लाइब्रेरी में कैसे अलग कर सकता हूं? क्या वस्तुओं का समाधान कुछ विवरण के कारखाने वर्ग को वापस करने के लिए है? हालाँकि, इसे कैसे परिभाषित किया जा सकता है ताकि कोर लाइब्रेरी ड्रॉ लाइब्रेरी पर निर्भर न हो?