रणनीति डिजाइन पैटर्न और राज्य डिजाइन पैटर्न के बीच अंतर क्या है?


219

रणनीति डिजाइन पैटर्न और राज्य डिजाइन पैटर्न के बीच अंतर क्या हैं? मैं वेब पर काफी कुछ लेखों के माध्यम से जा रहा था, लेकिन स्पष्ट रूप से अंतर नहीं कर पाया।

क्या कोई कृपया आम आदमी की शर्तों में अंतर बता सकता है?


यहाँ और मेरे स्वयं के टिप्पणियों के जवाबों के आधार पर, ऐसा लगता है कि कार्यान्वयन बड़े पैमाने पर (हालांकि पूरी तरह से नहीं) समान हैं। बल्कि, अंतर मुख्य रूप से एक इरादे का है: हम व्यवहार को अनुकूलित करने की कोशिश कर रहे हैं, या तो हमारे राज्य (राज्य पैटर्न) के आधार पर, या कुछ और (रणनीति पैटर्न) के आधार पर। अक्सर ऐसा होता है कि इंजेक्शन के माध्यम से कुछ और "ग्राहक क्या चुनता है"।
टीमो

जवाबों:


139

ईमानदारी से, दो पैटर्न व्यवहार में समान हैं, और उन दोनों के बीच का अंतर अलग-अलग होता है, जो आपके पूछने पर निर्भर करता है। कुछ लोकप्रिय विकल्प हैं:

  • राज्य संदर्भ ऑब्जेक्ट के संदर्भ को संग्रहीत करते हैं जिसमें उन्हें शामिल किया गया है। रणनीतियाँ नहीं।
  • राज्यों को स्वयं को प्रतिस्थापित करने की अनुमति है (IE: संदर्भ वस्तु की स्थिति को किसी और चीज़ में बदलने के लिए), जबकि रणनीतियाँ नहीं हैं।
  • रणनीतियाँ संदर्भ ऑब्जेक्ट को मापदंडों के रूप में पारित की जाती हैं, जबकि राज्यों को संदर्भ ऑब्जेक्ट द्वारा ही बनाया जाता है।
  • रणनीतियाँ केवल एक एकल, विशिष्ट कार्य को संभालती हैं, जबकि राज्य संदर्भ वस्तु के लिए हर चीज (या अधिकांश सब कुछ) के लिए अंतर्निहित कार्यान्वयन प्रदान करते हैं।

एक "क्लासिक" कार्यान्वयन सूची में प्रत्येक आइटम के लिए या तो राज्य या रणनीति से मेल खाएगा, लेकिन आप उन संकरों पर चलते हैं जिनमें दोनों का मिश्रण है। चाहे कोई विशेष अधिक हो, स्टेट-वाई या स्ट्रेटजी-वाई अंततः एक व्यक्तिपरक प्रश्न है।


6
यदि आप GoF को लोकप्रिय विकल्पों में से एक के रूप में गिना रहे हैं, तो वे असहमत होंगे कि राज्य आवश्यक रूप से संदर्भ द्वारा बनाए गए हैं (ग्राहक द्वारा बनाए जा सकते हैं और संदर्भ में पारित किए जा सकते हैं, जैसे कि रणनीति के साथ)।
विल हार्डविक-स्मिथ

109
  • रणनीति पैटर्न एक अलग कार्यान्वयन कि (मूल रूप से) सिद्ध एक ही बात करने के बारे में वास्तव में है, इसलिए है कि एक कार्यान्वयन अन्य रणनीति की आवश्यकता है के रूप में बदल सकते हैं। उदाहरण के लिए, आपके पास रणनीति पैटर्न में अलग-अलग सॉर्टिंग एल्गोरिदम हो सकते हैं। ऑब्जेक्ट पर कॉल करने वाले के आधार पर परिवर्तन नहीं होता है, जिसके आधार पर रणनीति को नियोजित किया जा रहा है, लेकिन रणनीति की परवाह किए बिना लक्ष्य समान है (संग्रह को सॉर्ट करें)।
  • राज्य पैटर्न, राज्य के आधार पर अलग अलग बातें कर रही है, जबकि फोन करने वाले हर संभव राज्य मिलनसार के बोझ से राहत मिली छोड़ने के बारे में है। इसलिए उदाहरण के लिए आपके पास एक ऐसी getStatus()विधि हो सकती है जो ऑब्जेक्ट की स्थिति के आधार पर विभिन्न स्थितियों को लौटाएगी, लेकिन विधि के कॉलर को प्रत्येक संभावित स्थिति के लिए अलग-अलग कोडित करने की आवश्यकता नहीं है।

1
लेकिन रणनीति पैटर्न में रणनीति को कौन बदलता है ??
नूर

1
@ अब, आमतौर पर यह किसी प्रकार का एक पैरामीटर या क्षेत्र है। वास्तविक कॉलर का कोड रणनीति में बदलाव के आधार पर नहीं बदला गया है।
यिशई

4
@ अभी नहीं, हां, लेकिन किसी भी रणनीति पैटर्न में मैं अभी सोच सकता हूं, यह एक फ्रंट फ्रंट निर्णय होगा जो बीच में नहीं बदलेगा।
यिशै

2
मैं एक ही समस्या, राज्य या रणनीति के साथ हूं, मुझे लगता है कि कुछ शब्दों में भिन्नता है, राज्य, व्यवहार स्वचालित है, रणनीति, व्यवहार कॉलर द्वारा निर्धारित किया जाता है।
रेने एमएफ

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

85

अंतर बस इतना है कि वे विभिन्न समस्याओं को हल करते हैं:

  • राज्य के साथ पैटर्न सौदों क्या (राज्य या प्रकार) एक वस्तु (में) है - यह राज्य पर निर्भर व्यवहार समाहित है, जबकि
  • रणनीति के साथ पैटर्न सौदों कैसे एक वस्तु एक निश्चित कार्य करता है - यह एक एल्गोरिथ्म समाहित।

इन विभिन्न लक्ष्यों को प्राप्त करने के लिए निर्माण हालांकि बहुत समान हैं; दोनों पैटर्न प्रतिनिधिमंडल के साथ रचना के उदाहरण हैं।


उनके लाभों पर कुछ टिप्पणियां:

राज्य पैटर्न का उपयोग करके राज्य-धारण (संदर्भ) वर्ग को यह ज्ञात होने से राहत मिलती है कि यह किस राज्य या प्रकार का है और कौन से राज्य या प्रकार उपलब्ध हैं। इसका मतलब यह है कि वर्ग खुले-बंद डिज़ाइन सिद्धांत (OCP) का पालन करता है: वर्ग उन राज्यों / प्रकारों में परिवर्तन के लिए बंद है, लेकिन राज्य / प्रकार एक्सटेंशन के लिए खुले हैं।

का उपयोग करके रणनीति पैटर्न एल्गोरिथ्म का इस्तेमाल करने वाली (संदर्भ) वर्ग के ज्ञान से राहत मिली है कैसे (- "एल्गोरिथ्म") एक निश्चित कार्य करने के लिए। यह मामला OCP का पालन भी करता है; इस कार्य को करने के तरीके में बदलाव के लिए वर्ग को बंद कर दिया गया है, लेकिन इस कार्य को हल करने के लिए अन्य एल्गोरिदम के परिवर्धन के लिए डिजाइन बहुत खुला है।
यह संभावना एकल जिम्मेदारी सिद्धांत (एसआरपी) के संदर्भ वर्ग के संदर्भ में भी सुधार करती है। इसके अलावा एल्गोरिथ्म अन्य वर्गों द्वारा पुन: उपयोग के लिए आसानी से उपलब्ध हो जाता है।


42

क्या कोई आम आदमी की शर्तों में व्याख्या कर सकता है?

डिजाइन पैटर्न वास्तव में "आम आदमी" अवधारणा नहीं हैं, लेकिन मैं इसे यथासंभव स्पष्ट करने की कोशिश करूंगा। किसी भी डिज़ाइन पैटर्न को तीन आयामों में माना जा सकता है:

  1. समस्या हल करती है;
  2. पैटर्न की स्थिर संरचना (वर्ग आरेख);
  3. पैटर्न की गतिकी (अनुक्रम आरेख)।

आइए राज्य और रणनीति की तुलना करें।

समस्या हल करती है

राज्य का उपयोग दो मामलों में से एक में किया जाता है [GoF book p। 306] :

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

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

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

मुझे व्यक्तिगत रूप से यह पैटर्न उपयोगी नहीं लगा। आप हमेशा लुकअप टेबल (यह एक OO तरीका नहीं है, लेकिन यह बहुत अच्छी तरह से काम करता है) का उपयोग करके परिमित राज्य मशीनों को लागू कर सकता है।

रणनीति का उपयोग निम्नलिखित [GoF book p के लिए किया जाता है 316] :

  • कई संबंधित कक्षाएं केवल उनके व्यवहार में भिन्न होती हैं। रणनीतियाँ कई व्यवहारों में से एक के साथ एक वर्ग को कॉन्फ़िगर करने का एक तरीका प्रदान करती हैं।
  • आपको एल्गोरिथ्म के विभिन्न प्रकारों की आवश्यकता है। उदाहरण के लिए, आप अलग-अलग स्थान / समय व्यापार-नापसंद को दर्शाते एल्गोरिदम को परिभाषित कर सकते हैं। इन वेरिएंट को एल्गोरिदम [एचओ 88] की श्रेणी पदानुक्रम के रूप में लागू किए जाने पर रणनीतियों का उपयोग किया जा सकता है।
  • एक एल्गोरिथ्म डेटा का उपयोग करता है जिसके बारे में ग्राहकों को पता नहीं होना चाहिए। जटिल, एल्गोरिथ्म-विशिष्ट डेटा संरचनाओं को उजागर करने से बचने के लिए रणनीति पैटर्न का उपयोग करें।
  • एक वर्ग कई व्यवहारों को परिभाषित करता है, और ये इसके संचालन में कई सशर्त बयानों के रूप में दिखाई देते हैं। कई सशर्तियों के बजाय, संबंधित सशर्त शाखाओं को अपने स्वयं के रणनीति वर्ग में स्थानांतरित करें।

रणनीति लागू करने का अंतिम मामला पॉलिमॉर्फिज्म के साथ रिप्लेसमेंट कंडीशनल के रूप में जाना जाता है

सारांश: राज्य और रणनीति बहुत भिन्न समस्याओं को हल करते हैं। यदि आपकी समस्या को एक परिमित राज्य मशीन के साथ तैयार नहीं किया जा सकता है, तो संभव है कि राज्य पैटर्न उपयुक्त न हो। यदि आपकी समस्या जटिल एल्गोरिथ्म के अलग-अलग रूपों के बारे में नहीं है, तो रणनीति लागू नहीं होती है।

पैटर्न की स्थैतिक संरचना

राज्य में निम्नलिखित यूएमएल वर्ग संरचना है:

प्लांटयूएमएल स्टेट पैटर्न का वर्ग आरेख

रणनीति में निम्नलिखित UML वर्ग संरचना है:

प्लांटयूएमएल रणनीति पैटर्न का वर्ग आरेख

सारांश: स्थैतिक संरचना के संदर्भ में, ये दो पैटर्न ज्यादातर समान हैं। वास्तव में, इस तरह के पैटर्न का पता लगाने वाले उपकरण यह मानते हैं कि " [...] पैटर्न की संरचना समान है, एक स्वचालित प्रक्रिया द्वारा उनके भेद को रोकती है (उदाहरण के लिए, वैचारिक जानकारी का उल्लेख किए बिना)। "

एक बड़ा अंतर हो सकता है, हालांकि, अगर कंक्रीटस्टेट्स खुद को राज्य के बदलाव का फैसला करते हैं ( ऊपर चित्र में "" निर्धारित कर सकते हैं "संघों को देखें)। इसके परिणामस्वरूप ठोस राज्यों के बीच युग्मन होता है। उदाहरण के लिए (अगला खंड देखें), राज्य A राज्य बी के लिए संक्रमण का निर्धारण करता है। यदि संदर्भ वर्ग अगले ठोस राज्य में संक्रमण का फैसला करता है, तो ये निर्भरताएं दूर हो जाती हैं।

पैटर्न की गतिशीलता

जैसा कि ऊपर दिए गए समस्या अनुभाग में बताया गया है, राज्य का तात्पर्य है कि व्यवहार किसी वस्तु की अवस्था के आधार पर रन-टाइम में बदलता है । इसलिए, राज्य संक्रमण की धारणा लागू होती है, जैसा कि परिमित राज्य मशीन के संबंध में चर्चा की गई थी । [GoF] में उल्लेख किया गया है कि संक्रमणों को या तो कंकरीट के उपवर्गों में, या एक केंद्रीकृत स्थान में परिभाषित किया जा सकता है (जैसे कि तालिका आधारित स्थान)।

चलो एक साधारण परिमित राज्य मशीन मान लेते हैं:

दो राज्यों और एक संक्रमण के साथ PlantUML राज्य संक्रमण आरेख

उपवर्गों ने राज्य संक्रमण (अगली राज्य वस्तु वापस करके) तय करते हुए, गतिशील कुछ इस तरह दिखता है:

स्टेट ट्रांज़िशन के लिए प्लांटयूएमएल अनुक्रम आरेख

रणनीति की गतिशीलता को दिखाने के लिए , वास्तविक उदाहरण उधार लेना उपयोगी है ।

रणनीति बदलाव के लिए प्लांटयूएमएल अनुक्रम आरेख

सारांश : प्रत्येक पैटर्न संदर्भ के आधार पर कुछ करने के लिए एक बहुरूपिक कॉल का उपयोग करता है। राज्य पैटर्न में, बहुपद कॉल (संक्रमण) अक्सर अगले राज्य में परिवर्तन का कारण बनता है । रणनीति पैटर्न में, बहुरूपिक कॉल आमतौर पर संदर्भ को नहीं बदलता है (उदाहरण के लिए, क्रेडिट कार्ड द्वारा भुगतान करने के बाद एक बार आप पेपैल द्वारा अगली बार भुगतान नहीं करेंगे)। फिर से, स्टेट पैटर्न की गतिकी इसकी संगत फिनिनेट स्टेट मशीन द्वारा निर्धारित की जाती है , जो (मेरे लिए) इस पैटर्न के सही अनुप्रयोग के लिए आवश्यक है।


मेरे लिए यह अंतर मेरे लिए बहुत अंतर करने में मददगार था। स्टेट मशीन का तर्क लगता है कि यह आईएमएचओ के अनुकूल है। यह वास्तव में एक सैद्धांतिक कंप्यूटर विज्ञान के तरीके में उपरोक्त उत्तरों को पूरा करता है।
medunes

यह उत्तर बहुत उपयोगी है, मेरे लिए यह सबसे अच्छा है।
चॉफोटड्डी

25

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

छँटाई एल्गोरिदम आमतौर पर एक उदाहरण के रूप में उपयोग किया जाता है क्योंकि वे सभी एक ही तरह की चीज़ करते हैं (सॉर्ट)। यदि प्रत्येक अलग-अलग छंटाई एल्गोरिथ्म को अपनी कक्षा में रखा जाता है, तो ग्राहक आसानी से चुन सकता है कि कौन सा एल्गोरिथ्म का उपयोग करना है और पैटर्न इसे एक्सेस करने का एक आसान तरीका प्रदान करता है।

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


16

ग्राहक कॉल से निपटने के लिए एक आईवीआर (इंटरएक्टिव वॉयस रिस्पांस) प्रणाली पर विचार करें। आप इसे ग्राहकों को संभालने के लिए प्रोग्राम करना चाह सकते हैं:

  • काम के दिन
  • छुट्टियां

इस स्थिति को संभालने के लिए आप स्टेट पैटर्न का उपयोग कर सकते हैं ।

  • छुट्टी : आईवीआर केवल यह कहते हुए प्रतिक्रिया करता है कि ' कॉल केवल 9 बजे से 5 बजे के बीच के कार्य दिवसों पर ली जा सकती है ।'
  • कार्य दिवस : यह ग्राहक को ग्राहक सेवा कार्यकारी से जोड़कर प्रतिक्रिया करता है।

एक ग्राहक को समर्थन कार्यकारी से जोड़ने की यह प्रक्रिया खुद एक रणनीति पैटर्न का उपयोग करके लागू की जा सकती है, जहां अधिकारियों को निम्न में से किसी एक के आधार पर चुना जाता है:

  • राउंड रोबिन
  • कम से कम हाल ही में प्रयुक्त
  • अन्य प्राथमिकता आधारित एल्गोरिदम

रणनीति पैटर्न कुछ क्रिया करने के लिए ' कैसे ' पर फैसला करता है और राज्य पैटर्न उन्हें प्रदर्शन करने के लिए ' कब ' पर तय करता है।


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

14

रणनीति उन वस्तुओं का प्रतिनिधित्व करती है जो कुछ करते हैं, एक ही शुरुआत और अंतिम परिणामों के साथ, लेकिन आंतरिक रूप से विभिन्न तरीकों का उपयोग करते हुए। इस अर्थ में वे एक क्रिया के कार्यान्वयन का प्रतिनिधित्व करने के लिए समान हैं। राज्य पैटर्न OTOH उन वस्तुओं का उपयोग करता है जो "कुछ" हैं - एक ऑपरेशन की स्थिति। हालांकि वे उस डेटा पर भी परिचालन का प्रतिनिधित्व कर सकते हैं, वे एक क्रिया की तुलना में एक संज्ञा का प्रतिनिधित्व करने के लिए अधिक अनुरूप हैं, और राज्य मशीनों के अनुरूप हैं।


11

रणनीति: रणनीति तय की जाती है और आमतौर पर इसमें कई चरण होते हैं। (सॉर्टिंग केवल एक कदम है और इस प्रकार यह एक बहुत बुरा उदाहरण है क्योंकि यह इस पैटर्न के उद्देश्य को समझने के लिए बहुत ही आदिम है)। रणनीति में आपकी "मुख्य" दिनचर्या कुछ सार तरीकों को बुला रही है। उदाहरण के लिए "एंटर रूम स्ट्रेटेजी", "मेन-मेथड" है goThroughDoor (), जो दिखता है: अप्रोचडूर (), अगर (लॉक ()) ओपनलॉक (); खुला दरवाजा(); enterRoom (); मोड़(); बंद दरवाजा(); if (wasocked ()) lockDoor ();

अब इस सामान्य "एल्गोरिथ्म" के उप-वर्ग एक बंद कमरे से दूसरे कमरे में जाने के लिए संभव बंद दरवाजे के माध्यम से एल्गोरिथ्म के चरणों को लागू कर सकते हैं।

दूसरे शब्दों में, रणनीति को उपवर्गित करने से मूल एल्गोरिदम नहीं बदलता है, केवल व्यक्तिगत चरण।

यह एक टेम्पलेट विधि पैटर्न है। अब अपने स्वयं के कार्यान्वयन वस्तुओं में एक साथ जुड़े कदमों (अनलॉकिंग / लॉकिंग और ओपनिंग / क्लोजिंग) को डालें और उन्हें सौंपें। जैसे चाबी वाला ताला और कोड कार्ड वाला ताला दो तरह के ताले होते हैं। "चरण" ऑब्जेक्ट्स की रणनीति से प्रतिनिधि। अब आपके पास एक रणनीति पैटर्न है।

एक स्टेट पैटर्न कुछ पूरी तरह से अलग है।

आपके पास एक रैपिंग ऑब्जेक्ट और रैपेड ऑब्जेक्ट है। लिपटे एक "राज्य" है। राज्य वस्तु केवल अपने आवरण के माध्यम से ही पहुँच जाती है। अब आप किसी भी समय लपेटी गई वस्तु को बदल सकते हैं, इस प्रकार आवरण अपनी स्थिति, या यहाँ तक कि "वर्ग" या प्रकार को बदल सकता है।

उदाहरण के लिए, आपके पास सेवा पर एक लॉग है। यह एक उपयोगकर्ता नाम और एक पासवर्ड स्वीकार करता है। इसमें केवल एक ही विधि है: लॉगऑन (स्ट्रिंग यूजरनेम, स्ट्रिंग पासवार्ड)। यह तय करने के बजाय कि लॉग ऑन स्वीकार किया जाता है या नहीं, यह निर्णय को किसी राज्य की वस्तु को दर्शाता है। यदि उपयोगकर्ता / पास संयोजन मान्य है और लॉग ऑन करता है, तो यह ऑब्जेक्ट आमतौर पर सिर्फ जांच करता है। लेकिन अब आप "चेकर" का आदान-प्रदान एक से कर सकते हैं, जो केवल निजीकृत उपयोगकर्ताओं को लॉग ऑन करने देता है (जैसे मेनटेनस टाइम के दौरान) या किसी एक को लॉग ऑन करने देता है। इसका मतलब है कि "चेकर" सिस्टम की "लॉग ऑन स्थिति" को व्यक्त करता है।

सबसे महत्वपूर्ण अंतर यह है: जब आप एक रणनीति चुनते हैं तो आप उसके साथ चिपके रहते हैं जब तक आप उसके साथ नहीं होते। इसका मतलब है कि आप इसकी "मुख्य विधि" कहते हैं और जब तक कि आप चल रहे होते हैं तब तक आप रणनीति को कभी नहीं बदलते हैं। अपने सिस्टम के रनटाइम के दौरान राज्य पैटर्न की स्थिति में OTOH, जैसा कि आप फिट देखते हैं, आप मनमाने ढंग से राज्य बदलते हैं।


9

रणनीति पैटर्न का उपयोग तब किया जाता है जब आपके पास किसी विशिष्ट कार्य के लिए कई एल्गोरिथ्म होते हैं और क्लाइंट रनटाइम में उपयोग किए जाने वाले वास्तविक कार्यान्वयन का फैसला करता है।

विकी रणनीति पैटर्न लेख से यूएमएल आरेख :

यहां छवि विवरण दर्ज करें

प्रमुख विशेषताऐं:

  1. यह एक व्यवहारिक पैटर्न है।
  2. यह प्रतिनिधिमंडल पर आधारित है।
  3. यह विधि व्यवहार को संशोधित करके ऑब्जेक्ट के हिम्मत को बदलता है।
  4. इसका उपयोग एल्गोरिदम के परिवार के बीच स्विच करने के लिए किया जाता है।
  5. यह रन टाइम में ऑब्जेक्ट के व्यवहार को बदल देता है।

अधिक जानकारी और वास्तविक दुनिया उदाहरणों के लिए इस पोस्ट का संदर्भ लें:

रणनीति पैटर्न का वास्तविक विश्व उदाहरण

स्टेट पैटर्न किसी वस्तु को उसके आंतरिक अवस्था में परिवर्तन होने पर उसके व्यवहार को बदलने की अनुमति देता है

यूएमआई आरेख विकि स्टेट पैटर्न लेख से:

यहां छवि विवरण दर्ज करें

यदि हमें किसी वस्तु के व्यवहार को उसके राज्य के आधार पर बदलना है, तो हमारे पास ऑब्जेक्ट में एक स्टेट वैरिएबल हो सकता है और स्टेट के आधार पर विभिन्न क्रियाओं को करने के लिए if-else कंडीशन ब्लॉक का उपयोग कर सकता है। राज्य पैटर्न का उपयोग प्रसंग और राज्य के माध्यम से इसे प्राप्त करने के लिए एक व्यवस्थित और हार-युग्मित तरीका प्रदान करने के लिए किया जाता है कार्यान्वयन के ।

इस जर्नलदेव का संदर्भ लेंअधिक जानकारी के लिए लेख का ।

से मुख्य अंतर sourcemaking और journaldev लेख:

  1. बाध्यकारी समय के साथ राज्य और रणनीति के बीच अंतर निहित है। रणनीति एक बाँध-एक बार पैटर्न है, जबकि राज्य अधिक गतिशील है
  2. राज्य और रणनीति के बीच अंतर इरादे में है। रणनीति के साथ, एल्गोरिथ्म का विकल्प काफी स्थिर हैराज्य के साथ, "संदर्भ" वस्तु की स्थिति में बदलाव के कारण यह रणनीति की वस्तुओं के अपने "पैलेट" से चयन करता है
  3. उदाहरण के रूप में प्रसंग में राज्य होता है और ऐसे कई कार्य हो सकते हैं जिनका कार्यान्वयन राज्य पर निर्भर हो सकता है जबकि रणनीति पैटर्न में रणनीति को विधि के रूप में पारित किया जाता है और संदर्भ वस्तु के पास इसे संग्रहीत करने के लिए कोई चर नहीं होता है।

5

आम आदमी की भाषा में,

रणनीति पैटर्न में, कोई राज्य नहीं हैं या उन सभी में एक ही राज्य है। किसी एक कार्य को करने के सभी तरीके अलग-अलग होते हैं, जैसे अलग-अलग डॉक्टर एक ही रोगी के एक ही रोग को अलग-अलग तरीकों से मानते हैं।

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

यदि हम तकनीकी रूप से इसे समझने की कोशिश करते हैं, तो दोनों की तुलना के आधार पर, हम स्थिति की विषयवस्तु खो सकते हैं, क्योंकि दोनों बहुत समान दिखते हैं।


2

दोनों प्रतिमान एक आधार वर्ग के प्रतिनिधि होते हैं जिसमें कई व्युत्पन्न होते हैं, लेकिन यह केवल राज्य के पैटर्न में है कि ये व्युत्पन्न वर्ग संदर्भ श्रेणी के संदर्भ हैं।

इसे देखने का एक और तरीका यह है कि रणनीति पैटर्न राज्य पैटर्न का एक सरल संस्करण है; एक उप-पैटर्न, यदि आपको पसंद है। यह वास्तव में निर्भर करता है कि क्या आप चाहते हैं कि व्युत्पन्न राज्य संदर्भ को संदर्भ में वापस रखें या नहीं (यानी: क्या आप चाहते हैं कि वे संदर्भ पर विधियों को कॉल करें)।

अधिक जानकारी के लिए: रॉबर्ट सी मार्टिन (और मीका मार्टिन) ने अपनी पुस्तक "एजाइल प्रिंसिपल्स, पैटर्न एंड प्रैक्टिस इन सी #" में इसका उत्तर दिया। ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/013185788 )


2

यह एक बहुत पुराना प्रश्न है, लेकिन फिर भी, मैं भी उन्हीं उत्तरों की तलाश में था और यही मैंने खोजा है।

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

https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm

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

https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

दोनों कार्यान्वयन करीब सिद्धांत को खोलते हैं इसलिए डेवलपर में नए राज्यों को राज्य पैटर्न और नए एल्गोरिथ्म में जोड़ने की क्षमता है।

लेकिन अंतर यह है कि उनका उपयोग किया जाता है जो कि राज्य पैटर्न का उपयोग वस्तु की स्थिति के आधार पर विभिन्न तर्क को निष्पादित करने के लिए किया जाता है। और रणनीति के एक मामले में अलग तर्क।


2

राज्य व्युत्पन्न राज्यों के भीतर थोड़ी निर्भरता के साथ आता है: जैसे एक राज्य को इसके बाद आने वाले अन्य राज्यों के बारे में पता होता है। उदाहरण के लिए, समर किसी भी मौसम के लिए सर्दियों के बाद आता है, या खरीदारी के लिए डिपॉजिट स्टेट के बाद डिलीवरी स्टेट।

दूसरी ओर, रणनीति की इन जैसी कोई निर्भरता नहीं है। यहां, कार्यक्रम / उत्पाद प्रकार के आधार पर किसी भी प्रकार की स्थिति को आरंभ किया जा सकता है।


1

अंतर की चर्चा http://c2.com/cgi/wiki?StrategyPattern में की गई है । मैंने डेटा के विश्लेषण के लिए अलग-अलग एल्गोरिदम को एक समग्र ढांचे के भीतर चुनने की अनुमति देने के लिए रणनीति पैटर्न का उपयोग किया है। इसके माध्यम से आप समग्र रूपरेखा और उसके तर्क को बदले बिना एल्गोरिदम जोड़ सकते हैं।

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


1

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


1

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


0

जब आपके पास एक परियोजना है जिसे 2 कार्यों में विभाजित किया जा सकता है:

कार्य 1: आप पूरा करने के लिए दो अलग-अलग एल्गोरिदम में से एक का उपयोग कर सकते हैं: alg1, alg2

कार्य 2: आप पूरा करने के लिए तीन अलग-अलग एल्गोरिदम में से एक का उपयोग कर सकते हैं: alg3, alg4, alg5

alg1 और alg2 विनिमेय हैं; alg3, alg4 और alg5 विनिमेय हैं।

कार्य 1 और कार्य 2 में प्रदर्शन करने के लिए कौन सा एल्गोरिदम चुनना राज्यों पर निर्भर करता है:

राज्य 1: आपको कार्य 1 में alg1 और कार्य 2 में alg3 की आवश्यकता है

राज्य 2: आपको कार्य 1 में alg2 और कार्य 2 में alg5 की आवश्यकता है

आप संदर्भ 1 से राज्य 2 तक राज्य वस्तु बदल सकते हैं। फिर आपका कार्य alg1 और alg3 के बजाय alg2 और alg5 द्वारा पूरा किया जाएगा।

आप कार्य 1 या कार्य 2 के लिए अधिक विनिमेय एल्गोरिदम जोड़ सकते हैं। यह रणनीति पैटर्न है।

आपके पास कार्य 1 और कार्य 2 में एल्गोरिदम के विभिन्न संयोजन वाले अधिक राज्य हो सकते हैं। राज्य पैटर्न आपको एक राज्य से दूसरे राज्य में स्विच करने और एल्गोरिदम के विभिन्न संयोजन करने की अनुमति देता है।


0

'रणनीति' केवल एक एल्गोरिथ्म है जिसे आप अपनी आवश्यकता के अनुसार विभिन्न परिस्थितियों में बदल सकते हैं, और यह आपके लिए कुछ प्रक्रिया करता है। पूर्व। आप चुन सकते हैं कि किसी फ़ाइल को कैसे संपीड़ित करें। zip या rar ... एक विधि में।

लेकिन 'राज्य' आपके सभी ऑब्जेक्ट व्यवहार को बदल सकता है, जब यह बदलता है, तो यह अन्य क्षेत्रों को भी बदल सकता है ... यही कारण है कि इसके मालिक का संदर्भ है। आपको ध्यान देना चाहिए कि ऑब्जेक्ट फ़ील्ड को बदलना ऑब्जेक्ट व्यवहार को बिल्कुल बदल सकता है। पूर्व। जब आप State0 को State1 में बदल देते हैं, तो आप एक पूर्णांक को 10 में बदल देते हैं। इसलिए जब हम obj.f0 () कहते हैं, तो कुछ गणना करते हैं और उस पूर्णांक का उपयोग करते हैं, यह परिणाम को प्रभावित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.