আসুন আমি একটি অনুক্রমের আছে Item
ক্লাস: Rectangle, Circle, Triangle
। আমি সেগুলি আঁকতে সক্ষম হতে চাই, সুতরাং আমার প্রথম সম্ভাবনাটি Draw()
প্রতিটিটিতে একটি ভার্চুয়াল পদ্ধতি যুক্ত করা:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
যাইহোক, আমি অঙ্কন কার্যকারিতাটি একটি পৃথক ড্র লাইব্রেরিতে বিভক্ত করতে চাই যখন কোর লাইব্রেরিতে কেবলমাত্র প্রাথমিক উপস্থাপনা রয়েছে contains আমি ভাবতে পারি এমন বেশ কয়েকটি সম্ভাবনা রয়েছে:
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();
} ....
}
}
};
এটি আদর্শ নয় কারণ এটি আরটিটিআইয়ের উপর নির্ভর করে এবং এক শ্রেণিকে শ্রেণিবিন্যাসের সমস্ত আইটেম সম্পর্কে সচেতন হতে বাধ্য করে।
2 - অন্য পদ্ধতিটি ItemDrawer
হায়ারার্কির প্রতি অঙ্কন করার দায়িত্ব স্থগিত করা ( RectangleDrawer
ইত্যাদি):
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
এটি আইটেমগুলির বেস উপস্থাপন এবং অঙ্কন করার কোডের মধ্যে উদ্বেগের বিভাজন অর্জন করে। সমস্যাটি হ'ল আইটেম ক্লাসগুলি অঙ্কন ক্লাসের উপর নির্ভরশীল।
আমি কীভাবে এই অঙ্কন কোডটি আলাদা লাইব্রেরিতে আলাদা করতে পারি? আইটেমগুলির সমাধানটি কি কোনও বিবরণের কারখানার শ্রেণি ফেরত দেয়? তবে এটি কীভাবে সংজ্ঞায়িত করা যায় যাতে কোর লাইব্রেরি ড্র লাইব্রেরির উপর নির্ভরশীল না?