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

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

स्ट्रेटेजी और विवर्त/संवर्त सिद्धांत
स्ट्रेटेजी पैटर्न के अनुसार, किसी वर्ग का बिहेवियर इनहेरिटेड में नहीं मिलना चाहिए। इसके अतिरिक्त, उन्हें इंटरफ़ेस का उपयोग करके इनकैप्सुलेट किया जाना चाहिए। यह विवर्त/संवर्त सिद्धांत (ओसीपी) के अनुकूल होता है, जो प्रस्तावित करता है कि क्लासेस विस्तार के लिए विवर्त होनी चाहिए किन्तु संशोधन के लिए संवर्त होनी चाहिए।
उदाहरण के रूप में, कार वर्ग पर विचार करें। किसी कार के लिए दो संभावित कार्य क्षमताएं ब्रेक और एक्सीलरेट होता हैं। चूंकि इसमें शीघ्रता लाने और ब्रेक लगाने के बिहेवियर मॉडलों के मध्य प्रायः परिवर्तित होते रहते हैं, इसलिए इन बिहेवियरों को उपवर्गों में प्रयुक्त करना सामान्य दृष्टिकोण है। इस दृष्टिकोण में यह महत्वपूर्ण न्यूनता हैं | इसलिए प्रत्येक नए कार मॉडल में गति और ब्रेक बिहेवियर घोषित किया जाना चाहिए। जैसे-जैसे मॉडलों की संख्या बढ़ती है, इन बिहेवियरों को प्रबंधित करने का काम अधिक बढ़ जाता है और सभी मॉडलों में कोड को डुप्लिकेट करने की आवश्यकता होती है। इसके अतिरिक्त, प्रत्येक मॉडल के कोड की जांच किए बिना उसके बिहेवियर की स्पष्टता प्रकृति निर्धारित करना सरल नहीं होती है।
स्ट्रेटेजी पैटर्न वंशानुक्रम पर संरचना का उपयोग करता है। स्ट्रेटेजी पैटर्न में, बिहेवियर को भिन्न-भिन्न इंटरफेस और विशिष्ट वर्गों के रूप में परिभाषित किया जाता है जो इन इंटरफेस को प्रयुक्त करते हैं। यह बिहेवियर और बिहेवियर का उपयोग करने वाले वर्ग के मध्य उत्तम भिन्नता की अनुमति देता है। बिहेवियर को उन वर्गों को ब्रेक किए बिना परिवर्तित जा सकता है जो इसका उपयोग करते हैं, और वर्ग किसी भी महत्वपूर्ण कोड परिवर्तन की आवश्यकता के बिना उपयोग किए गए विशिष्ट कार्यान्वयन को परिवर्तित बिहेवियर के मध्य स्विच कर सकते हैं। बिहेवियर को रन-टाइम के साथ-साथ डिज़ाइन-टाइम पर भी परिवर्तित किया जा सकता है। उदाहरण के लिए, ब्रेक बिहेवियर मेंबर को परिवर्तित कार ऑब्जेक्ट ब्रेक बिहेवियर को BrakeWithABS()
से Brake()
में परिवर्तित brakeBehavior
किया जा सकता है |
brakeBehavior = new Brake();
/* Encapsulated family of Algorithms
* Interface and its implementations
*/
public interface IBrakeBehavior {
public void brake();
}
public class BrakeWithABS implements IBrakeBehavior {
public void brake() {
System.out.println("Brake with ABS applied");
}
}
public class Brake implements IBrakeBehavior {
public void brake() {
System.out.println("Simple Brake applied");
}
}
/* Client that can use the algorithms above interchangeably */
public abstract class Car {
private IBrakeBehavior brakeBehavior;
public Car(IBrakeBehavior brakeBehavior) {
this.brakeBehavior = brakeBehavior;
}
public void applyBrake() {
brakeBehavior.brake();
}
public void setBrakeBehavior(IBrakeBehavior brakeType) {
this.brakeBehavior = brakeType;
}
}
/* Client 1 uses one algorithm (Brake) in the constructor */
public class Sedan extends Car {
public Sedan() {
super(new Brake());
}
}
/* Client 2 uses another algorithm (BrakeWithABS) in the constructor */
public class SUV extends Car {
public SUV() {
super(new BrakeWithABS());
}
}
/* Using the Car example */
public class CarExample {
public static void main(final String[] arguments) {
Car sedanCar = new Sedan();
sedanCar.applyBrake(); // This will invoke class "Brake"
Car suvCar = new SUV();
suvCar.applyBrake(); // This will invoke class "BrakeWithABS"
// set brake behavior dynamically
suvCar.setBrakeBehavior( new Brake() );
suvCar.applyBrake(); // This will invoke class "Brake"
}
}
यह भी देखें
- डिपेंडेंसी इंजेक्शन
- उच्च-क्रम का कार्य
- ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग शब्दों की सूची
- मिक्सिन
- पालिसी-आधारित डिज़ाइन
- क्लास टाइप
- इकाई-घटक-सिस्टम
- इनहेरिटेड पर रचना
संदर्भ

- ↑ "रणनीति डिज़ाइन पैटर्न - समस्या, समाधान और प्रयोज्यता". w3sDesign.com. Retrieved 2017-08-12.
- ↑ Eric Freeman, Elisabeth Freeman, Kathy Sierra and Bert Bates, Head First Design Patterns, First Edition, Chapter 1, Page 24, O'Reilly Media, Inc, 2004. ISBN 978-0-596-00712-6
- ↑ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. pp. 315ff. ISBN 0-201-63361-2.
{{cite book}}
: CS1 maint: multiple names: authors list (link) - ↑ "रणनीति डिज़ाइन पैटर्न - संरचना और सहयोग". w3sDesign.com. Retrieved 2017-08-12.
- ↑ "Design Patterns Quick Reference – McDonaldLand".
बाहरी संबंध

- Strategy Pattern in UML (in Spanish)
- Geary, David (April 26, 2002). "Strategy for success". Java Design Patterns. JavaWorld. Retrieved 2020-07-20.
- Strategy Pattern for C article
- Refactoring: Replace Type Code with State/Strategy
- The Strategy Design Pattern at the Wayback Machine (archived 2017-04-15) Implementation of the Strategy pattern in JavaScript