मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि मेरे पास एक और दिलचस्प उदाहरण है जिसे मैंने हाल ही में लागू किया है।
यह दस्तावेज़ वितरण प्रणाली में उपयोग किए जा रहे रणनीति पैटर्न का एक बहुत ही व्यावहारिक उदाहरण है।
मेरे पास एक पीडीएफ डिलीवरी सिस्टम था जिसमें बहुत सारे दस्तावेज और कुछ मेटाडेटा युक्त एक संग्रह प्राप्त हुआ। मेटाडेटा के आधार पर, यह तय किया कि दस्तावेज़ को कहाँ रखा जाए; कहते हैं, डेटा के आधार पर, मैं में दस्तावेज़ संग्रहीत कर सकती है A
, B
या C
भंडारण प्रणालियों, या तीनों के मिश्रण।
विभिन्न ग्राहकों ने इस प्रणाली का उपयोग किया, और उनके पास त्रुटियों के मामले में अलग-अलग रोलबैक / त्रुटि से निपटने की आवश्यकताएं थीं: कोई चाहता था कि वितरण प्रणाली पहली त्रुटि पर बंद हो, सभी दस्तावेजों को पहले से ही उनके भंडारण में वितरित छोड़ दें, लेकिन प्रक्रिया को रोकें और कुछ और वितरित न करें ; एक और यह चाहता था कि B
स्टोर करने के दौरान त्रुटियों के मामले में रोलबैक से C
, लेकिन जो कुछ भी पहले से वितरित किया गया था उसे छोड़ दें A
। यह कल्पना करना आसान है कि तीसरे या चौथे को भी अलग-अलग ज़रूरतें होंगी।
समस्या को हल करने के लिए, मैंने एक बुनियादी डिलीवरी क्लास बनाई है जिसमें डिलीवरी लॉजिक है, साथ ही सभी स्टोरेज से सामान वापस लाने के तरीके। उन तरीकों को त्रुटियों के मामले में सीधे वितरण प्रणाली द्वारा नहीं बुलाया जाता है। इसके बजाय, क्लास "रोलबैक / एरर हैंडलिंग स्ट्रेटेजी" क्लास प्राप्त करने के लिए डिपेंडेंसी इंजेक्शन का उपयोग करता है (सिस्टम का उपयोग करते हुए ग्राहक के आधार पर), जिसे त्रुटियों के मामले में कहा जाता है, जो बदले में रोलबैक विधियों को कॉल करता है यदि यह उस रणनीति के लिए उपयुक्त है।
डिलीवरी क्लास खुद ही रिपोर्ट करता है कि स्ट्रेटजी क्लास में क्या चल रहा है (क्या डॉक्यूमेंट्स को स्टोरेज तक पहुंचाया गया, और क्या फॉलोवर्स हुए), और जब भी कोई त्रुटि होती है, तो यह स्ट्रैटजी पूछती है कि क्या जारी रखना है या नहीं। यदि रणनीति "इसे बंद करो" कहती है, तो क्लास रणनीति की "क्लीनअप" विधि कहती है, जो पहले बताई गई जानकारी का उपयोग करके तय करती है कि डिलीवरी क्लास से कॉलबैक के लिए कौन से रोलबैक तरीके हैं, या बस कुछ नहीं करें।
rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);
if (rollbackStrategy.mustAbort()) {
rollbackStrategy.rollback(); // rollback whatever is needed based on reports
return false;
}
इसलिए मेरे पास अब दो अलग-अलग रणनीतियाँ हैं: एक वह है QuitterStrategy
(जो पहली त्रुटि पर क्विट करता है और कुछ भी साफ नहीं करता है) और दूसरा वह है जो MaximizeDeliveryToAStrategy
(जितना संभव हो उतना संभव है कि प्रक्रिया को निरस्त न किया जाए और कभी भी स्टोरेज के लिए रोलबैक सामान वितरित न किया जाए A
, लेकिन B
यदि वितरण C
विफल रहता है) से सामान की वापसी ।
मेरी समझ से, यह रणनीति पैटर्न का एक उदाहरण है। यदि आप (हां, आप पढ़ रहे हैं) तो मुझे लगता है कि मैं गलत हूं, कृपया नीचे टिप्पणी करें और मुझे बताएं। मैं इस बात के लिए उत्सुक हूं कि रणनीति पैटर्न का "शुद्ध" उपयोग क्या होगा, और मेरे कार्यान्वयन के कौन से पहलू परिभाषा का उल्लंघन करते हैं। मुझे लगता है कि यह थोड़ा अजीब लग रहा है क्योंकि रणनीति इंटरफ़ेस थोड़ा मोटा है। मैंने अब तक जितने भी उदाहरण देखे हैं, वे केवल एक ही विधि का उपयोग करते हैं, लेकिन मुझे अभी भी लगता है कि यह एक एल्गोरिथ्म को एन्कैप्सुलेट करता है (यदि व्यावसायिक तर्क का एक टुकड़ा एल्गोरिथ्म माना जा सकता है, जो मुझे लगता है कि यह करता है)।
चूंकि वितरण निष्पादन के दौरान घटनाओं के बारे में रणनीति को भी अधिसूचित किया जाता है, इसलिए इसे एक पर्यवेक्षक भी माना जा सकता है , लेकिन यह एक और कहानी है।
थोड़ा शोध करने से, ऐसा लगता है कि यह एक "समग्र पैटर्न" है (जैसे एमवीसी, एक पैटर्न जो एक विशेष तरीके से नीचे कई डिजाइन पैटर्न का उपयोग करता है) जिसे सलाहकार कहा जाता है । यह इस पर एक सलाहकार है कि डिलीवरी जारी रहनी चाहिए या नहीं, लेकिन यह भी एक सक्रिय त्रुटि हैंडलर है क्योंकि यह पूछे जाने पर सामान रोलबैक कर सकता है।
वैसे भी, यह एक बहुत ही जटिल उदाहरण है जो आपकी उस भावना को बना सकता है कि रणनीति पैटर्न के उपयोग सभी बहुत सरल / मूर्खतापूर्ण हैं। यह वास्तव में जटिल और और भी अधिक लागू हो सकता है जब अन्य पैटर्न के साथ एक साथ उपयोग किया जाता है।