आइए स्ट्रैटेजी डिज़ाइन पैटर्न के बारे में बात करते हैं!
यह डिज़ाइन पैटर्न आपको एक मेथड के अंदर मुख्य एल्गोरिदम को बदलने में मदद करता है।
आप इसे एक क्लास पास करके करते हैं जो इस एल्गोरिदम को लागू करता है, बजाय इसे क्लास में हार्डकोड करने के।
और जब मैं एल्गोरिदम कहता हूं तो मेरा मतलब फैंसी कंप्यूटर साइंस एल्गोरिदम से नहीं है, बल्कि किसी भी कोड से है जो परिणाम प्राप्त करने के लिए चरणों के अनुक्रम का पालन करता है।
स्ट्रैटेजी पैटर्न का उपयोग कब करें
यह पैटर्न वास्तव में कौन सी समस्या हल कर रहा है?
ओपन/क्लोज्ड सिद्धांत की समस्या।
यह सिद्धांत कहता है कि:
"सॉफ्टवेयर एंटिटीज (क्लासेस, मॉड्यूल्स, मेथड्स) विस्तार के लिए खुली होनी चाहिए और संशोधन के लिए बंद।"
इसका मतलब है कि एक क्लास को नई चीजें करने के लिए आपको क्लास को स्वयं नहीं बदलना चाहिए। यह आपके कोड को अधिक लचीला और मजबूत बनाता है।
लेकिन आप इसे कैसे पूरा करते हैं?
स्ट्रैटेजी पैटर्न जैसे डिज़ाइन पैटर्न का उपयोग करके 🙂
मान लीजिए आपके पास एक ReportGenerator क्लास है, और आप उसी डेटा का उपयोग करके कई प्रकार की रिपोर्ट फॉर्मेट्स जनरेट करना चाहते हैं।
आप प्रत्येक रिपोर्ट प्रकार के लिए एक मेथड लिख सकते हैं, लेकिन इसका मतलब होगा कि हर बार जब आप एक नया प्रकार जोड़ना चाहते हैं तो आपको क्लास को बदलना होगा (एक नया मेथड जोड़कर), ओपन/क्लोज सिद्धांत को तोड़ना।
या इससे भी बदतर!
आपके पास सभी प्रकार के if स्टेटमेंट्स के साथ एक विशाल एकल मेथड हो सकता है… ये अक्सर अच्छी तरह से समाप्त नहीं होते।
लेकिन क्या होगा अगर क्लास को यह नहीं पता होता कि रिपोर्ट्स को कैसे फॉर्मेट करना है?
क्या होगा अगर एल्गोरिदम क्लास के बाहर से आया?
तब हम जब चाहें फॉर्मेटिंग एल्गोरिदम को बदल सकते हैं बिना क्लास को बदले।
यह समस्या हल करता है।
और यही स्ट्रैटेजी पैटर्न के बारे में है।
स्ट्रैटेजी पैटर्न उदाहरण
एक स्ट्रैटेजी को एक सिंगल मेथड वाली क्लास के रूप में लागू किया जाता है।
यहां ReportGenerator क्लास के लिए कुछ फॉर्मेटिंग स्ट्रैटेजी हैं:
require 'json' module ReportFormatters class JSON def self.format(data) data.to_json end end class PlainText def self.format(data) data.to_s end end class HTML def self.format(data) html = "" html << "
- " data.each { |product, amount| html << "
- #{product}: #{amount} " } html << "
ध्यान दें कि सभी स्ट्रैटेजी format मेथड को लागू करती हैं। यह मेथड रिपोर्ट जनरेटर क्लास द्वारा कॉल किया जाएगा।
यहां कोड है:
class ReportGenerator def self.generate(data, formatter) formatter.format(data) end end data = { onions: 31, potatoes: 24, eggs: 10 } p ReportGenerator.generate(data, ReportFormatters::HTML) p ReportGenerator.generate(data, ReportFormatters::JSON) p ReportGenerator.generate(data, ReportFormatters::PlainText) अब:
यदि आप आउटपुट फॉर्मेट बदलना चाहते हैं ( HTML से PlainText ) तो आपको बस एक अलग स्ट्रैटेजी पास करनी होगी और यह तब तक काम करेगा जब तक स्ट्रैटेजी format मेथड को लागू करती है।
इस पैटर्न के बारे में सोचने का एक और तरीका यह है कि आप एक सलाहकार को काम पर रख रहे हैं जो एक विशिष्ट व्यावसायिक रणनीति में विशेषज्ञ है, सलाहकार आएगा और आपके लिए रणनीति लागू करेगा, फिर यह रणनीति एक विशिष्ट परिणाम उत्पन्न करेगी।
इसके विपरीत, डेकोरेटर पैटर्न जैसा पैटर्न क्रिसमस ट्री में नए आभूषण जोड़कर उसे अधिक आकर्षक बनाने जैसा है।
आप एक समय में केवल 1 रणनीति के साथ काम कर सकते हैं, लेकिन आप जितने चाहें उतने आभूषण रख सकते हैं।
वीडियो
सारांश
आपने स्ट्रैटेजी डिज़ाइन पैटर्न के बारे में सीखा, इसका उपयोग तब करें जब आपको अपने क्लास के काम के हिस्से को बदलने की आवश्यकता हो बिना क्लास को बदले।
पढ़ने के लिए धन्यवाद!
अगर आपको यह दिलचस्प लगा तो इस पोस्ट को ट्विटर पर शेयर करना न भूलें, इससे अधिक लोग इसका आनंद ले सकेंगे 🙂