5

मुझे ज़िम्मेदारी की श्रृंखला का उपयोग करने की आवश्यकता क्यों है, अगर मैं कुछ कमांडर को सभी कंटेनर में लोड कर सकता हूं और केवल एक-एक करके आदेश निष्पादित कर सकता हूं। यह एक पंक्ति में एक अनुरोध संसाधित करने की एक श्रृंखला बना देगा। बीटीडब्ल्यू मुझे लगता है कि यह सीओआर से बेहतर है क्योंकि आप कुछ विशेष आदेशों को हटा सकते हैं या रनटाइम पर किसी अन्य कमांड के साथ प्रतिस्थापित कर सकते हैं, जबकि सीओआर के लिए आपको श्रृंखला में कुछ बदलने के लिए एक और श्रृंखला बनाने की आवश्यकता है क्योंकि आपके पास तत्वों तक पहुंच नहीं है पहले तत्व को छोड़कर श्रृंखला। (यह वास्तव में एक भी लिंक्ड सूची है।)उत्तरदायित्व की श्रृंखला एक कतार या स्टैक में कमांड

उत्तर

1

बस "इसे सरल रखें मूर्खतापूर्ण" करने के लिए :-)

एक कतार/स्टैक बनाएं जब आप विशेष रूप से इसकी जरूरत है, और आप को पता होगा कि जब आपको उसकी आवश्यकता , है ना?

उदाहरण के लिए अगर आप की तरह कुछ सरल डेटा हेरफेर करना था:

data.clean().format().save(); 

बनाम

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

भी नोटिस, मैं नया डेटा संरचना बनाने के लिए अधिक कोड लिखना पड़ा (आज्ञा ढेर)।

लेकिन कहें कि यह कुछ और रणनीतिक है, एक शूटर गेम कहें। खिलाड़ी को गोली मार दी जा सकती है, मार डाला जा सकता है, आदि, और परिणाम खेल के चुनिंदा कठिनाई स्तर पर निर्भर करते हैं।

headShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new KillPlayer()); 

bodyShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new LooseHealth()); 

player.onHit = function(hitPoint){ 
    hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this); 
}; 

इस मामले में ध्यान दें, हमें एक ऐसी रणनीति तैयार करनी है जिसे रनटाइम पर पास किया जा सके और हो।

तो जब आसान मोड में, बॉडीशॉट में अंतिम तत्व (लूजहेल्थ) नहीं हो सकता है, और हेडशॉट में अंतिम तत्व के रूप में किलप्लेयर के बजाय लूजहेल्थ हो सकता है।

उम्मीद है कि यह मदद करता है।

+0

कौन सा आसान है? सीओआर या ढेर? मेरे लिए दोनों एक ही sh * टी हैं। – Narek

+0

ठीक है, – Nishant

+0

से ऊपर संपादित उत्तर देखें आपने स्थिर 'data.clean()। प्रारूप() सेव() को सहेज लिया है। लेकिन मैं स्टैक बनाम सीओआर से पूछ रहा था, क्योंकि रनटाइम परिवर्तन दोनों में किया जा सकता है, क्योंकि सीओआर में आप नई श्रृंखला बना सकते हैं। – Narek

0

मुझे नहीं लगता कि कोआर को एकल-लिंक्ड सूची की आवश्यकता है। यह एक आम कार्यान्वयन हो सकता है; लेकिन एक दोगुनी-लिंक्ड सूची या लगभग किसी भी अन्य संग्रह/कंटेनर का उपयोग किया जा सकता है, जब तक यह संदेश प्रेषक को संदेश प्राप्तकर्ता से हटा देता है। जो आप वर्णन करते हैं वह CoR पैटर्न के साथ पूरी तरह से संगत लगता है। आपने चेन को कॉन्फ़िगर करने की क्षमता को बढ़ाया है। यह ध्यान रखें कि GoF definition हमें निर्देश देता चेन लागू करने के लिए,

कड़ी मेहनत से तारों हैंडलर रिश्ते और पूर्वता के बिना

,

महत्वपूर्ण है ... लेकिन मुझे नहीं लगता है कि के बारे में हमारी पसंद को प्रतिबंधित करना चाहिए हैंडलर के लिए संग्रह।


यह भी ध्यान दें कि जिम्मेदारी की श्रृंखला प्रसंस्करण की श्रृंखला के समान नहीं है। उत्तरार्द्ध अनुक्रमिक संचालन का अर्थ है (यानी pipeline) जबकि पूर्व श्रेणीबद्ध है लेकिन आवश्यक अनुक्रमिक नहीं है। हैंडलर (या उनमें से कोई भी) का कोई भी नंबर और संयोजन एक अनुरोध पर कार्य नहीं कर सकता है।

अंत में, मुझे लगता है कि प्रश्न में "आदेश" शब्द का उपयोग चेन में हैंडलर का संदर्भ है, और Command Pattern का संदर्भ नहीं है। सीओआर और कमांड पैटर्न चेन के अनुरोधों के संदर्भ में पूरक हो सकते हैं, लेकिन परंपरागत रूप से कमांडरों के रूप में कमांडरों के मामले में नहीं।

संबंधित मुद्दे