आपके पास संदेशों को प्रसारित करने या प्राप्त करने की अनुमति देने वाले इंटरफेस का एक बहुत अच्छी तरह से परिभाषित सेट होना चाहिए - उन्हें एक EventScheduler का संदर्भ देते हुए तुच्छ होना चाहिए। यदि ऐसा नहीं है, या यदि आप ऐसा महसूस करते हैं कि इवेंट शेड्यूलर को "बहुत सारे" प्रकारों में पास करना शामिल है, तो आपके हाथों पर एक बड़ी डिज़ाइन समस्या हो सकती है (एक आश्रित निर्भरता, जिसे सिंग्लेटन्स छूटना चाहते हैं, हल नहीं। )।
याद रखें कि अनुसूचक को उस इंटरफेस तक पहुंचाने की तकनीक की जरूरत है, जो " निर्भरता इंजेक्शन " का एक रूप है , आप इस मामले में एक नई निर्भरता इंजेक्ट नहीं कर रहे हैं । यह एक निर्भरता है जो आपके पास पहले से ही सिस्टम में है, लेकिन अब आप इसे एक स्पष्ट (बनाम एक सिंगलटन की निहित निर्भरता) बना रहे हैं। अंगूठे के एक नियम के रूप में, स्पष्ट निर्भरताएं अधिक बेहतर हैं क्योंकि वे अधिक स्व-दस्तावेजीकरण हैं।
आप इवेंट शेड्यूल करने वाले उपभोक्ताओं को एक-दूसरे से अलग करने के बाद खुद को और अधिक लचीलापन प्रदान करते हैं (क्योंकि वे सभी एक ही शेड्यूलर से बंधे नहीं हैं), जो स्थानीय क्लाइंट / सर्वर सेटअप या कई अन्य विकल्पों के परीक्षण या अनुकरण के लिए उपयोगी हो सकता है। - आपको इन अन्य विकल्पों की आवश्यकता नहीं हो सकती है, लेकिन आपने कृत्रिम रूप से खुद को उनसे प्रतिबंधित करने के प्रयास को समाप्त नहीं किया है, जो कि एक प्लस है।
संपादित करें: मेरा मतलब है कि जब मैं चारों ओर अनुसूचक को पारित करने के बारे में बात करता हूं, तो यह है: यदि आपके पास कुछ गेम घटक है जो टकराव का जवाब देने के लिए ज़िम्मेदार है, तो यह संभवत: कुछ टक्कर उत्तरदाता कारखाने के माध्यम से बनाया गया है जो आपकी भौतिकी परत का हिस्सा है। यदि आप किसी शेड्यूलर इंस्टेंस के साथ फ़ैक्टरी का निर्माण करते हैं, तो यह उस उदाहरण को किसी भी उत्तरदाता के पास भेज सकता है, जो तब घटनाओं को बढ़ाने के लिए इसका उपयोग कर सकता है (या शायद अन्य घटनाओं के लिए सदस्यता ले सकता है)।
class CollisionResponderFactory {
public CollisionResponderFactory (EventScheduler scheduler) {
this.scheduler = scheduler;
}
CollisionResponder CreateResponder() {
return new CollisionResponder(scheduler);
}
EventScheduler scheduler;
}
class CollisionResponder {
public CollisionResponder (EventScheduler scheduler) {
this.scheduler = scheduler;
}
public void OnCollision(GameObject a, GameObject b) {
if(a.IsBullet) {
scheduler.RaiseEvent(E_BIG_EXPLOSION);
}
}
EventScheduler scheduler;
}
यह स्पष्ट रूप से एक बहुत ही जटिल और सरल उदाहरण है क्योंकि मुझे नहीं पता कि आपका गेम ऑब्जेक्ट मॉडल क्या है; हालाँकि यह घटना अनुसूचक पर निर्भरता को स्पष्ट करता है और आगे इनकैप्सुलेशन के लिए कुछ क्षमता दिखाता है (आपको आवश्यक रूप से उत्तरदाता को अनुसूचक को पारित करने की आवश्यकता नहीं होगी यदि वे उसी वैचारिक स्तर पर एक उच्च स्तरीय टक्कर प्रतिक्रिया प्रणाली के माध्यम से संचारित होते हैं) फ़ैक्टरी जो शेड्यूलर के माध्यम से घटनाओं को बढ़ाने के नट और बोल्ट के साथ निपटा है। यह घटना प्रेषण प्रणाली के कार्यान्वयन विवरण से प्रत्येक अलग-अलग उत्तरदाता कार्यान्वयन को अलग करेगा, जैसे कि टकराव को बढ़ाने के लिए विशिष्ट घटना, जो आपके सिस्टम के लिए आदर्श हो सकती है। - या नहीं)।