2012-11-28 20 views
10

मैंने दोनों पैटर्नों को सीखा है लेकिन इन दो पैटर्न के बीच मतभेदों को समझ में नहीं आया है।आगंतुक और रणनीति पैटर्न के बीच क्या अंतर है?

मुझे परिदृश्य नहीं पता, इन पैटर्न का उपयोग कब और कहाँ करें।

क्या कोई भी मतभेदों को समझ सकता है और मामलों का उपयोग कर सकता है?

+3

यह विभिन्न पैटर्न से संबंधित एक अच्छा तरीका है: http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

अच्छा लिंक @ jco.owens! –

+0

लिंक अब टूटा हुआ है .. क्या आप @ jco.owens अपडेट कर सकते हैं? – Joe

उत्तर

3

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

इनपुट पैटर्न के आधार पर एक विशेष तार्किक पथ चुनने के लिए रणनीति पैटर्न का उपयोग किया जाता है। क्लासिक उदाहरण प्रमाणीकरण फ़िल्टर है जहां Authorization HTTP शीर्षलेख में मान के आधार पर, एनटीएलएम/नेगोशिएट/बेसिक जैसी विभिन्न प्रमाणीकरण रणनीतियों को चुना और चलाया जाता है। आने वाले अनुरोध के आधार पर फ़िल्टर प्रमाणीकरणस्ट्रेटी इंटरफ़ेस का संदर्भ रखेगा, एक विशेष प्रमाणीकरण रणनीति को चुना जाता है और इस संदर्भ को असाइन किया जाता है और निम्नानुसार कोड को उपयोग की जाने वाली सटीक रणनीति को जानने की आवश्यकता नहीं होती है।

+1

रणनीति पैटर्न का एक सरल उदाहरण - एक सूची को अलग-अलग क्रमबद्ध करने के लिए तुलनात्मक के विभिन्न कार्यान्वयन का उपयोग? – Scorpion

15

मुख्य अंतर यह है कि रणनीति पैटर्न संबंधित व्यवहार के एक समूह समाहित है, जबकि आगंतुक पैटर्न कई तरह के समूहों समाहित है।

  • आप रणनीति पैटर्न का उपयोग करना चाहिए जब आप एक व्यवहार संपुटित करने की जरूरत है - आप एल्गोरिदम के एक परिवार के हैं और आप रन टाइम पर उन के बीच चयन करने की आवश्यकता है, तो आप रणनीति पैटर्न इस्तेमाल करना चाहिए। यह बहुत आम है: यह हर बार होता है जब आप program to an interface
  • आप डबल प्रेषण लागू करने के लिए आगंतुक पैटर्न का उपयोग करना चाहिए - आप एल्गोरिदम एक से अधिक वस्तु के संबंध में आभासी होने की जरूरत है कि के एक समूह है। यह बहुत कम आम है, कुछ हद तक क्योंकि इसे लागू करना बहुत कठिन है।
+2

+1, आप उदाहरणों के साथ अधिक जानकारी प्राप्त कर सकते हैं लेकिन यह एक अच्छा geeky संक्षिप्त जवाब है। – Scorpion

+0

@dasblinkenlight क्या आप इसका अर्थ बता सकते हैं कि "क्या आपके पास एल्गोरिदम का एक समूह है जिसे एक से अधिक ऑब्जेक्ट के संबंध में वर्चुअल होने की आवश्यकता है।" – Geek

+0

@ गीक क्लासिक उदाहरण अभिव्यक्ति पेड़ है। एक तरफ, आपके पास समग्र पैटर्न (बेस अभिव्यक्ति, निरंतर अभिव्यक्ति, बाइनरी अभिव्यक्ति, फ़ंक्शन कॉल इत्यादि) के बाद कक्षाओं का एक समूह है, दूसरी तरफ, आपके पास एल्गोरिदम लागू करने वाले वर्गों का समूह है (XML में कनवर्ट करें, प्रिंट करें पाठ फ़ाइल, मूल्यांकन, इत्यादि) इस प्रकार आप जिस विधि को कॉल करना चाहते हैं वह अभिव्यक्ति के उप प्रकार पर निर्भर करता है ** और ** एल्गोरिदम के उप प्रकार पर निर्भर करता है, इसलिए व्यवहार एक से अधिक वर्ग के संबंध में आभासी है। इसके लिए आधिकारिक नाम [* डबल प्रेषण *] है (http://en.wikipedia.org/wiki/Double_dispatch)। स्पष्टीकरण के लिए – dasblinkenlight

2

आगंतुक पैटर्न आशय:

एक ऑपरेशन का प्रतिनिधित्व करते हैं एक वस्तु संरचना के तत्वों पर प्रदर्शन किया जाना है। आगंतुक आपको उन तत्वों के वर्गों को बदलने के बिना एक नया ऑपरेशन परिभाषित करने देता है जिस पर यह संचालित होता है।

उपयोग आगंतुक पैटर्न यदि:

  1. इसी प्रकार के संचालन के लिए एक संरचना में वर्गीकृत किया विभिन्न प्रकार की वस्तुओं पर प्रदर्शन किया जा करने के लिए है
  2. आप कई अलग और असंबंधित आपरेशन निष्पादित करने के लिए की जरूरत है ।यह वस्तुओं संरचना से ऑपरेशन को अलग करती है
  3. नई संचालन
  4. बल्कि बल की तुलना में एक भी वर्ग में संबंधित संचालन इकट्ठा आप बदल सकते हैं या प्राप्त करने के लिए कक्षाओं
  5. कार्यों जोड़े वस्तु संरचना में बदलाव के बिना जोड़ा जा करने के लिए है जिसके लिए आप भी स्रोत नहीं है या स्रोत

हालांकि नहीं बदल सकते हैं वर्ग पुस्तकालयों के लिए विज़िटर पैट ऑब्जेक्ट में मौजूदा कोड को बदले बिना नया ऑपरेशन जोड़ने के लिए टर्न लचीलापन प्रदान करता है, यह लचीलापन कमजोर पड़ गया है।

यदि कोई नया विज़िटेबल ऑब्जेक्ट जोड़ा गया है, तो उसे विज़िटर & कंक्रीटविजिटर कक्षाओं में कोड परिवर्तन की आवश्यकता है। इस मुद्दे को हल करने के लिए एक समाधान है: प्रतिबिंब का उपयोग करें, जो प्रदर्शन पर असर डालेगा।

रणनीति पैटर्न आशय अधिक जानकारी के लिए और oodesign articlesourcemaking लेख का संदर्भ लें:

, एल्गोरिदम के एक परिवार को परिभाषित करें हर एक संपुटित, और उन्हें विनिमेय बनाते हैं। रणनीति एल्गोरिदम को उन ग्राहकों से स्वतंत्र रूप से भिन्न करने देती है जो इसका उपयोग करते हैं।

रणनीति आपको किसी वस्तु के गले को बदलने देती है।

अधिक जानकारी के लिए एसई सवालों के नीचे देखें:

Real World Example of the Strategy Pattern

0

व्यवहार जैसा कि ऊपर उल्लेख अंतर के अलावा, मैं भी निर्भरता के बारे में एक अंतर का अनुभव है और एक परियोजना के दौरान मामलों का उपयोग एक बार मैं पर काम कर रहा था , निम्नलिखित की तरह।

उदाहरण के लिए, आगंतुक कंक्रीट कक्षाओं के बारे में जानता है। इसलिए आप अपने आगंतुक कोड को बदलने की कीमत पर अधिक लचीला होंगे क्योंकि आप पदानुक्रम में नए ठोस वर्ग जोड़ते हैं। रणनीति में ऐसी कोई बात नहीं है। इस संदर्भ में, यदि संदर्भ के बावजूद आपके पास दिए गए इनपुट के साथ केवल कुछ आउटपुट लौटने के तरीके हैं तो रणनीति अधिक उपयुक्त हो जाती है।

इसके अलावा, विज़िटर पैटर्न भी चिंता को अलग करने के लिए एसओएलआईडी के एसआरपी को लागू करने के लिए उपयोग किया जाता है।

0

आगंतुक जब आप वर्गों में से एक परिवार है के लिए है और आपको लगता है कि परिवार में हर वर्ग के लिए नई कार्यक्षमता जोड़ने के लिए नहीं बल्कि वर्गों स्पर्श खुद को (या कि नई कार्यक्षमता एक ही स्थान पर परिभाषित करना चाहते हैं की जरूरत है - आगंतुक)

रणनीति जब आप वर्गों में से एक परिवार को ठीक से (जैसे प्रकार के रूप में कुछ वस्तुओं वे होते हैं) काम करने के लिए कुछ करने के लिए सक्षम होना चाहिए कि राशि के लिए है, लेकिन आप ग्राहक या करने के लिए अपने dependancy इंजेक्शन चाहते उन्हें बताओ कि ऐसा करने के लिए किस तरह से जाना है।