नहीं है, वहाँ बिल्कुल कोई मानक पैटर्न है।
मेरी सलाह नौसिखिया ओओ डिजाइन गड़बड़ी से बचने के लिए सब कुछ के लिए एक आम "बेस क्लास" इंटरफेस खोजने की कोशिश करने से है। आपका ड्रैगन आपके जादूगर से काफी अलग है, और प्यारा कोड अबास्ट्रक्शन को छोड़कर, दो इंटरफेस को मर्ज करने का प्रयास करके हासिल करने के लिए कुछ भी नहीं है। याद रखें, विरासत कोड पुन: उपयोग के लिए एक उपकरण नहीं है।
सरल दृष्टिकोण प्रत्येक (के रूप में आप पहले से ही वर्णन किया है) अपने स्वयं के आंतरिक राज्य बनाए रखने पर आपत्ति है, और है कि राज्य आकर्षित करने के लिए सक्षम होने के लिए है। यह वह जगह है जहां एक पुराना स्कूल स्विच स्टेटमेंट उसी प्रभाव के लिए पॉलिमॉर्फिज्म का उपयोग करने से अधिक स्पष्ट हो सकता है। उदाहरण:
class Dragon {
enum State { asleep, flying, breathing_fire };
public:
void draw() { /* old-school switch */
switch (cur_state){
case asleep: draw_asleep();
case flying: draw_flying();
case breathing_fire: draw_breathing_fire();
}
}
private:
void draw_asleep();
void draw_flying();
void draw_breathing_fire();
};
अनुभवी सी ++ डेवलपर्स (के रूप में वे चाहिए), उपरोक्त कोड में दम तोड़ देना होगा क्योंकि स्विच बयान लगभग वास्तव में क्या एक बहुरूपी विधि कॉल पूरा होता है - क्रम प्रेषण। (या यहां तक कि अधिक गुप्त: विधि पतों की एक तालिका।) मेरी व्यक्तिगत राय यह है कि इस विशिष्ट प्रकार की कक्षा के लिए, यानी एक सार्वजनिक मशीन इंटरफेस एक राज्य मशीन को समाहित करता है, स्विच स्टेटमेंट अधिक स्पष्ट और रखरखाव योग्य होता है क्योंकि यह राज्य मशीन बनाता है स्पष्ट कूदो। मुझे लगता है कि यह भी स्पष्ट है कि मुझे यह पता है कि यह आमतौर पर खराब सी ++ डिज़ाइन है।
इस डिजाइन के घर्षण राज्य मशीन और एकल सार्वजनिक इंटरफ़ेस के बीच की लाइन के कारण होता है। एक नींद ड्रैगन स्पष्ट रूप से एक उड़ान ड्रैगन के समान नहीं है। वास्तव में, इसमें कुछ भी सामान्य नहीं होगा। लेकिन उच्च स्तर के डिजाइन का कहना है कि दोनों एक ही ड्रैगन हैं। क्या झंझट है! क्या आप प्रत्येक राज्य के लिए अलग-अलग ड्रैगन ऑब्जेक्ट्स बनाते हैं? नहीं, क्योंकि यह कॉलर को राज्य अवधारणा का पर्दाफाश करेगा। क्या आप प्रत्येक राज्य के लिए अलग-अलग आंतरिक सहायक वस्तुएं बनाते हैं और उनसे प्रेषण करते हैं? संभवतः, लेकिन यह जल्दी गन्दा हो जाता है। उपर्युक्त दृष्टिकोण दोनों के बीच एक समझौता है।चापलूसी को अलग करने के रूप में स्विच स्टेटमेंट के बारे में सोचें। निजी इंटरफ़ेस के रूप में सार्वजनिक इंटरफ़ेस साफ़ है। केवल स्विच स्टेटमेंट में गंदी गड़बड़ी होती है। इस दृष्टिकोण पर विचार करें, और अन्य सुझावों पर भी विचार करें।
अंत में, अपने जादूगर और अपने ड्रैगन, आकर्षित करने के लिए एक सरल आवरण टेम्पलेट या functor पर्याप्त होगा:
struct Draw {
template <class S>
void operator()(S& s) { s.draw(); }
};
बिंदु आप सिर्फ इसलिए कि वे दोनों का समर्थन दो अलग-अलग वर्गों के विलय करने की जरूरत नहीं है कि है एक ही तार्किक ऑपरेशन।
मौजूदा ओपन सोर्स गेम से विचार चुराएं। –
std :: नक्शा <राज्य, एनीमेशन> - आंतरिक राज्य-से-एनीमेशन स्टोरेज के लिए, और बाहरी संग्रहण के लिए कोई भी खुला प्रारूप। – W55tKQbuRu28Q4xv