कार्यनीति पैटर्न

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

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

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

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

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

वर्ग आरेख




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

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

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

यह भी देखें

 * डिपेंडेंसी इंजेक्शन
 * उच्च-क्रम का कार्य
 * ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग शब्दों की सूची
 * मिक्सिन
 * पालिसी-आधारित डिज़ाइन
 * क्लास टाइप
 * इकाई-घटक-सिस्टम
 * इनहेरिटेड पर रचना

बाहरी संबंध

 * Strategy Pattern in UML
 * Strategy Pattern for C article
 * Refactoring: Replace Type Code with State/Strategy
 * Implementation of the Strategy pattern in JavaScript
 * Implementation of the Strategy pattern in JavaScript