मैं एक सिम्युलेटर लिख रहा हूं जिसमें कई इंटरफेस हैं जो सभी अनुरूपित वस्तुओं को लागू करते हैं। Entity
इंटरफ़ेस में विधियां हैं जिनके पास सभी ऑब्जेक्ट्स होना चाहिए, जैसे आईडी पुनर्प्राप्ति और ऑब्जेक्ट के राज्य के लिए समय चरण को आगे बढ़ाना। Collidable
Entity
बढ़ाता है, और वॉल्यूम और स्थिति के साथ कुछ भी प्रस्तुत करता है जिसे टकराव का पता लगाने एल्गोरिदम चलाने पर विचार किया जाना चाहिए। Field
Entity
बढ़ाता है, और किसी भी स्थान को किसी मान के लिए मानचित्रित करता है; इनका उपयोग चुंबकीय क्षेत्रों जैसी चीजों को मॉडल करने के लिए किया जाता है जो दुनिया में प्रवेश करते हैं लेकिन उनके पास कोई मात्रा या भौतिक रूप नहीं है। RigidBody
एक कक्षा है जो Collidable
लागू करती है और कठोर-शरीर गतिशीलता एल्गोरिदम प्रदान करती है। मेरे पास World
कक्षा है जो सभी Entities
का प्रबंधन करती है और इसमें सिम्युलेटर की घड़ी को आगे बढ़ाने और दुनिया को विभाजित करने के तरीके हैं ताकि टकराव का पता लगाने में अधिक कुशलता हो सके।इंटरफ़ेस के कार्यान्वयन को संग्रहीत करने और विशिष्ट कार्यान्वयन को पुनर्प्राप्त करने के लिए एक अच्छा पैटर्न क्या है?
मेरी समस्या में उपप्रकार World
से पुनर्प्राप्त करना शामिल है। मूल रूप से, World
में अभी तक Entities
का नक्शा आईडी के द्वारा किया गया था, और Field
या RigidBody
से छुटकारा पाने के लिए नक्शे के बाहर Entity
को पकड़ लेंगे और instanceof
वांछित उप प्रकार के लिए एक कास्ट चेक करें। मुझे अच्छी तरह से पता है कि instanceof
उपयोग पर फंसे हुए हैं, इसलिए, मैंने एक और दृष्टिकोण की कोशिश की।
वर्तमान में, मेरे पास प्रत्येक इंटरफ़ेस के लिए World
के भीतर अलग-अलग मानचित्र हैं। उदाहरण के लिए, Collidables
के साथ-साथ सभी Entities
के लिए मानचित्र के लिए एक मानचित्र है। addCollidable()
विधि दोनों मानचित्रों में जोड़ दी जाएगी, और getCollidable()
केवल Collidable
मानचित्र से पुनर्प्राप्त होगा। यह instanceof
से बचाता है, लेकिन यह अभी भी मुझे खराब डिजाइन की तरह लगता है। यदि मैं Entity
का विस्तार करने के लिए एक और इंटरफ़ेस का सपना देखता हूं, तो मुझे World
और संबंधित विधियों में एक और मानचित्र की आवश्यकता होगी।
मुझे लगता है कि यह समस्या बहुत अस्पष्ट नहीं है, तो आमतौर पर इस स्थिति में क्या किया जाता है?
संपादित
मैं नहीं मानता कि आगंतुक पैटर्न यहाँ काम करेंगे, के रूप में आगंतुक आप ठोस प्रकार पर प्रेषण करने के लिए अनुमति देता है, और मेरे पुनर्प्राप्ति तरीकों के कुछ इंटरफ़ेस प्रकार पुनः प्राप्त करने की जरूरत है। उदाहरण के लिए, World
RigidBodies
और अन्य ऐसे ठोस वर्गों को पुनर्प्राप्त करने के लिए केवल आवश्यक विधियों के लिए विज़िटर काम करेगा, लेकिन मैं ऐसी विधि नहीं बना सकता जो आगंतुक के साथ सभी Collidables
पुनर्प्राप्त करे।
आपके पास कुछ हो सकता है जैसे <<टी एंटीटी> टी getEntityFromMap (Clase क्लैज) बढ़ाता है, 'यह विधि' कोलिडेबल्स 'मानचित्र की आवश्यकता को हटा देती है, और आप केवल' getEntityFromMap (Entity.class) 'के लिए पूछते हैं। अपने सबसे सामान्य मामले में इकाई, और .... –