2011-06-09 14 views
11

में कमांड पैटर्न सुविधाजनक क्यों है, मुझे समझ में नहीं आता कि ऑब्जेक्ट उन्मुख डिज़ाइन में कमांड पैटर्न सुविधाजनक क्यों है।मुझे समझ में नहीं आ रहा है कि ऑब्जेक्ट ओरिएंटेड डिज़ाइन

उपयोग करने के बजाए, आइए "स्विच" कमांड कहें, जिसमें लैंप क्लास का संदर्भ है, क्या मैं सिर्फ एक स्विच करने योग्य अमूर्त वर्ग नहीं बना सकता और इसकी विधियों का आह्वान नहीं कर सकता?

इस तरह से मैं आवेदक और रिसीवर को किसी भी तरह से रद्द कर रहा हूं और मुझे ईएसी रिसीवर कक्षा के लिए कमांड ऑब्जेक्ट बनाना नहीं है।

thanjs

उत्तर

12

आपका Switchable invoker और रिसीवर के बीच एक अमूर्त बनाता है लेकिन वे अभी भी मिलकर कर रहे हैं (invoker रिसीवर के लिए एक संदर्भ की जरूरत है)। कमांड पैटर्न आपको उस डिकूप्लिंग को बनाने देता है। आवेदक कुछ मध्यवर्ती घटक कहते हैं "अरे मुझे यह आदेश मिला है कि मैं निष्पादित करना चाहता हूं" और फिर मध्यवर्ती चीज गतिशील रूप से रिसीवर को उस अनुरोध को पास कर सकती है।

ps ... मुझे लगता है कि आपने विकिपीडिया से स्विच उदाहरण खींच लिया है। यह एक बहुत बुरा उदाहरण है कि यह पैटर्न उपयोगी क्यों है। better examples पर एक नज़र डालें।

+1

उदाहरण के लिए धन्यवाद। हालांकि, मुझे अभी भी आवेदक के बजाय कमांड में रिसीवर का संदर्भ रखने का लाभ नहीं दिख रहा है। दूसरे शब्दों में, क्यों उन्हें decoupling इतना उपयोगी है? किस स्थितियों में उपयोगी है? – aneuryzm

+0

क्या कोड को बनाए रखने योग्य रखने और आवेदक को अधिक पुन: प्रयोज्य बनाने के लिए मुख्य रीसो है? या अधिक व्यावहारिक फायदे हैं? – aneuryzm

+2

@ पैट्रिक, उन्हें अलग रखते हुए आप हमारे रिसीवर को इनवॉकर (या इसके विपरीत) को बदलने के बिना स्वैप कर सकते हैं। इस प्रकार, आसान रखरखाव। ऐसे परिदृश्य भी हैं जहां इनवॉर्टर और रिसीवर के बीच कनेक्शन कॉन्फ़िगरेशन फ़ाइलों, उपयोगकर्ता इनपुट या कुछ डेटा स्रोत के आधार पर रनटाइम तक निर्धारित नहीं किया जा सकता है। एक अच्छा उदाहरण के लिए –

8

मान लीजिए आप इस प्रकार की सूची बनाना चाहते:

  • दीपक
  • सेट ए/सी तापमान
  • प्ले "चंद्रमा नदी"

कार्यों और रिसीवर हैं चालू सभी अलग-अलग, इसलिए आपको उन सभी से डूबने वाले एक अमूर्तता की आवश्यकता होती है। जब आप पूर्ववत/फिर से या समान चीजों का समर्थन करना चाहते हैं तो कमांड पैटर्न भी आसान होता है।

+0

ठीक है, पूर्ववत/दोबारा संदर्भ में, मैं समझता हूं। लेकिन अन्य परिस्थितियों में, आप आवेदक और रिसीवर को क्यों रद्द करना चाहते हैं? – aneuryzm

+0

ऐसा इसलिए है क्योंकि आप कोड को बनाए रखने योग्य रखना चाहते हैं और आवेदक को अधिक पुन: प्रयोज्य बनाना चाहते हैं? या अधिक व्यावहारिक फायदे हैं? इतिहास तंत्र और कंपोजिट कमांड के लिए – aneuryzm

+0

+1 - दो क्लासिक्स। कमांड पैटर्न आमंत्रण के विवरण से आमंत्रण के कार्य को रद्द करता है। Invoker की तरफ से केवल कमांड.एक्सक्यूट() है, "डू" को "कैसे" से अलग किया जाता है। @ पैट्रिक, यह यहां इस्तेमाल किए गए स्विचिंग उदाहरण में रिमोट कंट्रोल के बारे में सोचने में मदद कर सकता है, या एक वेटर एक कुक द्वारा संसाधित होने के लिए ग्राहक के आदेश ले सकता है। – earcam

6

चलें इस पर गौर चाहते: जब ग्राहक कुछ कार्य निष्पादित करने के लिए रिसीवर चाहता है, तो ग्राहक के पास दो विकल्प,

  1. कॉल रिसीवर है और कार्य निष्पादित करने के लिए उसे बताओ।
  2. कुछ तीसरे पक्ष को कॉल करें जो रिसीवर को जानता है, और तीसरी पार्टी रिसीवर को संदेश भेज देगी।

पहला विकल्प, बेहतर लग रहा है परिदृश्य के थिंक के रूप में जब वहाँ रेस्तरां में आदेश लेने के लिए कोई वेटर है और आप उसे बताना कि आप क्या चाहते शेफ के लिए जाना है।

या मान लीजिए कि आपने अपना रिमोट खो दिया है और आपको टीवी पर जाना है और मैन्युअल रूप से बटन स्विच करना है।

यह लचीलापन प्रदान करता है ताकि आदेश न केवल सिंक्रोनस मोड में, बल्कि असीमित मोड में भी निष्पादित किया जा सके।

5
You -> Switch -> Light 

यहाँ स्विच आप और प्रकाश अलग करता। तो यह स्विच का उपयोग कर रोशनी चालू/बंद करना आसान बनाता है। यह कमांड पैटर्न का उपयोग करने में उपयोग (सुविधा) है।

आप - कमान Invoker
स्विच - कमान प्रबंधक
कमान - चालू/बंद
लाइट - वास्तविक implementer

तो आदेश पैटर्न वहाँ नहीं है तो आप मैन्युअल धारक में प्रकाश डाल करने के लिए जब जरूरत है और आवश्यकता होने पर इसे हटा दें।

0

प्रत्येक 'कमांड' ऑब्जेक्ट को लाइव ऑब्जेक्ट या कार्य के रूप में सोचें जो जानता है कि अपने आप से कुछ कैसे करना है। आपका invoker सिर्फ एक कतार या सूची है कि

1) इन सभी आदेश वस्तुओं धारण कर सकते हैं और

2) उन्हें क्रम में/फैशन है कि आप पसंद पर अमल है।

यह मॉडल हैंडलर के मामले में इतना लचीला है, है ना? कार्य करने के दौरान आवेदक किसी भी एल्गोरिदम को बफर, प्राथमिकता या पालन कर सकता है।

0

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

0

आदेश पैटर्न जोड़ उपयोगकर्ता क्रियाओंप्रणाली के साथ आदेश की एक सुनियोजित तरीका प्रदान करता है।

कमान पैटर्न को लागू करने से, आप उपयोगकर्ता के आदेश को संग्रहीत करने का संरचित तकनीक हो सकता है और इस प्रकार पूर्ववत करें/फिर के रूप में कार्रवाई की अनुमति है।

उदाहरण के लिए

, सरल पाठ संपादक के लिए कमान पैटर्न को लागू करने (GOF - अध्याय 2) इस प्रकार दिखाई देगा:

enter image description here

एक undoRedoPointer भंडारण करके, हम द्वारा पूर्ववत करें/फिर आपरेशन हासिल कर सकते हैं ऑब्जेक्ट के encapsulation का उल्लंघन किए बिना प्रत्येक बार एक आदेश निष्पादित किया जाता है काउंटर को बढ़ाने/घटाना। यह कमांड और memento design pattern संयोजन का परिणाम है।

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