मजेदार, यह प्रश्न मुझे ठीक उसी बातचीत की याद दिलाता है जो मैंने अपने एक इंजीनियर के साथ संचार पुस्तकालय के बारे में की थी जिस पर मैं काम कर रहा था।
आदेशों के बजाय, मेरे पास अनुरोध कक्षाएं थीं और तब मेरे पास अनुरोधकर्ता थे। डिजाइन बहुत पसंद था जो आप वर्णन कर रहे हैं। मुझे लगता है कि आपके पास भ्रम की स्थिति यह है कि आप अंग्रेजी शब्द "कमांड" देखते हैं, और तुरंत "क्रिया, क्रिया ... आदि" सोचते हैं।
लेकिन इस डिजाइन में, कमांड (या अनुरोध) को एक पत्र के रूप में सोचें। या उन लोगों के लिए जो एक डाक सेवा नहीं जानते हैं, ई-मेल के बारे में सोचें। यह केवल सामग्री है, उस सामग्री को किस तरह से काम किया जाना चाहिए, इससे अलग।
आप ऐसा क्यों करेंगे? अधिकांश सरल मामलों में, कमांड पैटर्न का कोई कारण नहीं है और आप इस वर्ग के काम को सीधे कर सकते हैं। हालाँकि, आपके डिज़ाइन में डिकॉप्लिंग करने से समझ में आता है कि क्या आपके एक्शन / कमांड / रिक्वेस्ट को कुछ दूरी तय करनी चाहिए। उदाहरण के लिए, पार, सॉकेट या पाइप, या डोमेन और बुनियादी ढांचे के बीच। या हो सकता है कि आपके आर्किटेक्चर में आपके कमांड्स लगातार बने रहें (जैसे कमांड हैंडलर एक बार में 1 कमांड कर सकता है, कुछ सिस्टम इवेंट्स के कारण, 200 कमांड्स आते हैं और पहले 40 प्रोसेस बंद हो जाते हैं)। उस स्थिति में, केवल एक सरल संदेश-युक्त वर्ग होने पर, केवल संदेश भाग को JSON / XML / बाइनरी / जो भी हो, उसे क्रमबद्ध करना बहुत आसान हो जाता है और जब तक इसका कमांड हैंडलर इसे संसाधित करने के लिए तैयार नहीं हो जाता है, तब तक इसे पाइप लाइन से गुजारें।
कमांडहैंडलर से कमांड को हटाने का एक और फायदा यह है कि अब आपके पास समानांतर वंशानुक्रम पदानुक्रम का विकल्प है। उदाहरण के लिए, आपके सभी कमांड बेस बेस क्लास से निकल सकते हैं जो क्रमबद्धता का समर्थन करता है। और हो सकता है कि आपके पास 20 कमांड हैंडलर में से 4 हैं जिनमें बहुत अधिक समानता है, अब आप उन हैंडलर बेस क्लास से प्राप्त कर सकते हैं। यदि आपके पास एक कक्षा में डेटा और कमांड हैंडलिंग है, तो इस प्रकार का संबंध जल्दी से नियंत्रण से बाहर हो जाएगा।
डिकॉउलिंग के लिए एक और उदाहरण यह होगा कि यदि आपकी कमांड को बहुत कम इनपुट की आवश्यकता होती है (जैसे 2 पूर्णांक और एक स्ट्रिंग) फिर भी इसकी हैंडलिंग लॉजिक पर्याप्त जटिल थी जहां आप मध्यवर्ती सदस्य चर में डेटा स्टोर करना चाहते हैं। यदि आप 50 कमांड को कतारबद्ध करते हैं, तो आप उस सभी इंटरमीडिएट स्टोरेज के लिए मेमोरी आवंटित नहीं करना चाहते हैं, इसलिए आप कमांडहैंडलर से कमांड को अलग करते हैं। अब आप 50 लाइट-वेट डेटा संरचनाओं को कतारबद्ध करते हैं और कमांडहैंडलर द्वारा कमांड को संसाधित करने वाले केवल एक बार (या एन बार यदि आपके पास एन हैंडलर हैं) अधिक जटिल डेटा स्टोरेज आवंटित किया जाता है।