2.1 अनुकूलक

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

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

अनुकूलक पैटर्न

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

महत्वपूर्ण! यदि कोड में आप एक वर्ग के लिए प्रत्यय एडॉप्टर से मिलते हैं, तो आपको यह विचार करने का पूरा अधिकार है कि यह वर्ग एक एडेप्टर के रूप में कार्य करता है और ऊपर वर्णित योजना के अनुसार काम करने वाले वर्गों के समूह से जुड़ा है।

इसका उपयोग उन मामलों में किया जाता है जहां सिस्टम आवश्यक डेटा और व्यवहार का समर्थन करता है, लेकिन इसका इंटरफ़ेस अनुपयुक्त है। एडेप्टर पैटर्न का सबसे आम उपयोग तब होता है जब आप एक ऐसा वर्ग बनाना चाहते हैं जो एक नए या मौजूदा अमूर्त वर्ग से प्राप्त होता है।

ताकत:

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

2.2 सज्जाकार

डेकोरेटर एक वस्तु के लिए अतिरिक्त व्यवहार को गतिशील रूप से जोड़ने के लिए एक संरचनात्मक डिजाइन पैटर्न है। डेकोरेटर पैटर्न कार्यक्षमता बढ़ाने के लिए उपवर्गीकरण के अभ्यास के लिए एक अच्छा और लचीला विकल्प प्रदान करता है।

डेकोरेटर पैटर्न

किसी वस्तु के लिए अतिरिक्त दायित्वों को गतिशील रूप से जोड़ने के लिए उपयोग किया जाता है ।

आप में से कई लोग पूछेंगे: आप गतिशील रूप से (जब प्रोग्राम चल रहा हो) किसी वस्तु में नया व्यवहार कैसे जोड़ सकते हैं? किसी वस्तु को टुकड़ों, यानी छोटी वस्तुओं से इकट्ठा किया जा सकता है। सर्वलेट्स में फ़िल्टर चेन याद रखें? या स्ट्रीम एपीआई जब आपने फ़िल्टर (), मानचित्र (), सूची () का उपयोग करके एक प्रश्न लिखा था?

IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);

डेकोरेटर पैटर्न की ताकत:

  • किसी वस्तु की कार्यक्षमता बढ़ाने के लिए उपवर्ग बनाने की आवश्यकता नहीं है।
  • कहीं भी नई कार्यक्षमता को गतिशील रूप से जोड़ने की क्षमता: कंक्रीटकंपोनेंट ऑब्जेक्ट की मुख्य कार्यक्षमता से पहले या बाद में।

2.3 प्रॉक्सी

प्रॉक्सी एक संरचनात्मक डिजाइन पैटर्न है जो एक वस्तु प्रदान करता है जो किसी अन्य वस्तु तक पहुंच को नियंत्रित करता है, इंटरसेप्ट करता है और उसके सभी कॉलों से गुजरता है।

डिप्टी (प्रॉक्सी)

प्रॉक्सी पैटर्न वास्तविक वस्तु के स्थान पर एक स्थानापन्न वस्तु प्रदान करता है। यह वस्तु मूल वस्तु तक पहुँच को नियंत्रित करती है। बहुत बार उपयोग किया जाता है।

याद रखें कि हमने मॉकिटो ढांचे का उपयोग कैसे किया और Mockito.spy() विधि या @Spy एनोटेशन का उपयोग करके वास्तविक वस्तु पर कॉल को इंटरसेप्ट किया? यह तब था जब एक विशेष प्रॉक्सी ऑब्जेक्ट बनाया गया था, जिसके माध्यम से मूल ऑब्जेक्ट को सभी कॉल पास हुए।

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

उद्देश्य से प्रॉक्सी के प्रकार :

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

2.4 पुल

ब्रिज पैटर्न एक संरचनात्मक डिजाइन पैटर्न है जिसका उपयोग "अमूर्तता और कार्यान्वयन को अलग करने के लिए किया जाता है ताकि वे स्वतंत्र रूप से बदल सकें।"

ब्रिज पैटर्न इनकैप्सुलेशन, एकत्रीकरण का उपयोग करता है, और कक्षाओं के बीच जिम्मेदारी साझा करने के लिए विरासत का उपयोग कर सकता है।

पुल

जब अमूर्तता और कार्यान्वयन अलग हो जाते हैं, तो वे स्वतंत्र रूप से बदल सकते हैं। दूसरे शब्दों में, जब ब्रिज पैटर्न के माध्यम से कार्यान्वित किया जाता है, तो इंटरफ़ेस की संरचना को बदलने से कार्यान्वयन की संरचना को बदलने में कोई बाधा नहीं आती है।

इस तरह के एक अमूर्त पर एक आकृति के रूप में विचार करें। कई प्रकार की आकृतियाँ हैं, प्रत्येक के अपने गुण और विधियाँ हैं। हालांकि, कुछ ऐसा है जो सभी आंकड़ों को एकजुट करता है। उदाहरण के लिए, प्रत्येक आकार को खुद को खींचने, स्केल करने आदि में सक्षम होना चाहिए।

साथ ही, ओएस या ग्राफिक्स लाइब्रेरी के प्रकार के आधार पर ड्राइंग ग्राफिक्स भिन्न हो सकते हैं। आकृतियों को विभिन्न ग्राफिक्स वातावरणों में स्वयं को आकर्षित करने में सक्षम होना चाहिए। लेकिन प्रत्येक आकृति में सभी आरेखण विधियों को लागू करना अव्यावहारिक है, या हर बार आरेखण विधि में परिवर्तन होने पर आकृति को संशोधित करना अव्यावहारिक है।

इस मामले में, ब्रिज पैटर्न मदद करता है, जिससे आप नई कक्षाएं बना सकते हैं जो विभिन्न ग्राफिकल वातावरणों में ड्राइंग को लागू करेंगे। इस दृष्टिकोण का उपयोग करके, नए आकार और उन्हें बनाने के तरीके दोनों को जोड़ना बहुत आसान है।

आरेखों में तीर द्वारा दर्शाए गए कनेक्शन के 2 अर्थ हो सकते हैं: ए) "एक प्रकार", लिस्कोव प्रतिस्थापन सिद्धांत के अनुसार, और बी) अमूर्त के संभावित कार्यान्वयन में से एक। भाषाएँ आमतौर पर a) और b) दोनों को लागू करने के लिए इनहेरिटेंस का उपयोग करती हैं, जो वर्ग पदानुक्रम को भड़काती है।

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

2.5 मुखौटा

फेकाडे पैटर्न एक संरचनात्मक डिजाइन पैटर्न है जो एक वस्तु के लिए सभी संभावित बाहरी कॉलों को कम करके सिस्टम की जटिलता को छुपाता है जो उन्हें सिस्टम में उपयुक्त वस्तुओं के लिए प्रतिनिधि करता है।

मुखौटा टेम्पलेट

असमान कार्यान्वयन या इंटरफेस के एक सेट के साथ एक एकीकृत इंटरफ़ेस कैसे प्रदान करें, उदाहरण के लिए, सबसिस्टम के लिए, यदि उस सबसिस्टम के लिए मजबूत युग्मन अवांछनीय है, या सबसिस्टम का कार्यान्वयन बदल सकता है?

सबसिस्टम के साथ बातचीत के एक बिंदु को परिभाषित करें - एक मुखौटा वस्तु जो सबसिस्टम के साथ एक सामान्य इंटरफ़ेस प्रदान करती है, और इसे इसके घटकों के साथ बातचीत करने की जिम्मेदारी सौंपती है। एक मुखौटा एक बाहरी वस्तु है जो सबसिस्टम सेवाओं के लिए एकल प्रवेश बिंदु प्रदान करता है।

अन्य सबसिस्टम घटकों का कार्यान्वयन निजी है और बाहरी घटकों को दिखाई नहीं देता है। फेकाडे ऑब्जेक्ट GRASP पैटर्न का कार्यान्वयन प्रदान करता है जो सबसिस्टम के कार्यान्वयन में परिवर्तन के खिलाफ सुरक्षा के संदर्भ में परिवर्तन के लिए प्रतिरोधी है।

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