आइए रणनीति डिजाइन पैटर्न के बारे में बात करते हैं!
यह डिज़ाइन पैटर्न आपको एक विधि के अंदर मुख्य एल्गोरिथम को बदलने में मदद करता है।
आप इसे कक्षा में हार्डकोड करने के बजाय, इस एल्गोरिथम को लागू करने वाली कक्षा में पास करके करते हैं।
और जब मैं एल्गोरिदम कहता हूं मेरा मतलब एक फैंसी कंप्यूटर साइंस एल्गोरिथम नहीं है, लेकिन कोई भी कोड जो परिणाम प्राप्त करने के लिए चरणों के अनुक्रम का पालन करता है।
रणनीति पैटर्न का उपयोग कब करें
यह पैटर्न वास्तव में किस समस्या का समाधान कर रहा है?
खुला/बंद सिद्धांत समस्या।
यह सिद्धांत कहता है कि:
<ब्लॉकक्वॉट>"सॉफ़्टवेयर इकाइयां (वर्ग, मॉड्यूल, विधियां) विस्तार के लिए खुली होनी चाहिए और संशोधन के लिए बंद होनी चाहिए।"
इसका मतलब यह है कि एक वर्ग को नई चीजें करने के लिए आपको कक्षा को बदलने की जरूरत नहीं है। यह आपके कोड को एक ही समय में अधिक लचीला और मजबूत बनाता है।
लेकिन आप इसे कैसे पूरा करते हैं?
रणनीति पैटर्न जैसे डिज़ाइन पैटर्न का उपयोग करना 🙂
मान लें कि आपके पास 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 रणनीति के साथ काम कर सकते हैं, लेकिन आपके पास जितने चाहें उतने गहने हो सकते हैं।
वीडियो
सारांश
आपने रणनीति डिजाइन पैटर्न के बारे में सीखा है, इसका उपयोग तब करें जब आपको कक्षा को बदलने के बिना अपनी कक्षा के कुछ हिस्से को बदलने की आवश्यकता हो।
पढ़ने के लिए धन्यवाद!
इस पोस्ट को साझा करना . करना न भूलें ट्विटर पर अगर आपको यह दिलचस्प लगा , यह अधिक लोगों को भी इसका आनंद लेने में मदद करेगा 🙂