एडेप्टर पैटर्न

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

उदाहरण एडेप्टर है, जो एक्सएमएल दस्तावेज़ के दस्तावेज़ ऑब्जेक्ट मॉडल के इंटरफ़ेस को ट्री संरचना में परिवर्तित करता है, जिसे प्रदर्शित किया जा सकता है।

सिंहावलोकन
एडॉप्टर डिज़ाइन पैटर्न तेईस जाने-माने गैंग ऑफ़ फोर (सॉफ़्टवेयर) डिज़ाइन पैटर्न में से एक है, जो वर्णन करता है कि लचीले और पुन: प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर को डिज़ाइन करने के लिए आवर्ती डिज़ाइन समस्याओं को कैसे हल किया जाए, अर्थात् ऐसी वस्तुएँ जिन्हें प्रयुक्त करना, बदलना, परीक्षण, और पुन: उपयोग करना सरल है।

एडॉप्टर डिज़ाइन पैटर्न समस्याओं को हल करता है जैसे:


 * वर्ग का पुन: उपयोग कैसे किया जा सकता है, जिसमें क्लाइंट की आवश्यकता वाला इंटरफ़ेस नहीं है?


 * असंगत इंटरफेस वाली कक्षाएं एक साथ कैसे कार्य कर सकती हैं?
 * वर्ग के लिए वैकल्पिक इंटरफ़ेस कैसे प्रदान किया जा सकता है?

अधिकांशतः (पहले से उपस्थित) वर्ग का पुन: उपयोग नहीं किया जा सकता है क्योंकि इसका इंटरफ़ेस इंटरफ़ेस क्लाइंट की आवश्यकता के अनुरूप नहीं होता है।

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

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

ग्राहक यह नहीं जानते हैं कि वे  वर्ग के साथ सीधे कार्य करते हैं या   के माध्यम से उस वर्ग के साथ कार्य करते हैं जिसमें   इंटरफ़ेस नहीं है।

नीचे यूएमएल क्लास डायग्राम भी देखें।

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

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

यूएमएल वर्ग आरेख
उपरोक्त यूएमएल वर्ग आरेख में, जिस  वर्ग को   इंटरफ़ेस की आवश्यकता होती है, वह सीधे   वर्ग का पुन: उपयोग नहीं कर सकता क्योंकि इसका इंटरफ़ेस   इंटरफ़ेस के अनुरूप नहीं होता है। इसके अतिरिक्त,     वर्ग के माध्यम से कार्य करता है जो   के संदर्भ में   इंटरफ़ेस को प्रयुक्त करता है:
 * विधि रन-टाइम पर   ऑब्जेक्ट को प्रत्यायोजित करके   इंटरफ़ेस को प्रयुक्त करता है।
 * विधि कंपाइल-टाइम पर   क्लास से इनहेरिट करके   इंटरफेस को प्रयुक्त करता है।

ऑब्जेक्ट एडेप्टर पैटर्न
इस एडॉप्टर पैटर्न में, एडेप्टर में उस वर्ग का उदाहरण होता है जिसे वह लपेटता है। इस स्थिति में, एडेप्टर लिपटे ऑब्जेक्ट की आवृत्ति के लिए कॉल करता है।



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



संकलन समय समाधान से प्रेरणा
यह के लिए कुछ डेटा के साथ  की आपूर्ति करने के लिए वांछित है, आइए हम कुछ  डेटा मान लें। संकलन समय समाधान है: चूँकि, मान लीजिए कि स्ट्रिंग डेटा का प्रारूप विविध होना चाहिए। संकलन समय समाधान वंशानुक्रम का उपयोग करना है:

और संभवतया फैक्टरी पैटर्न के माध्यम से रनटाइम पर सही स्वरूपण ऑब्जेक्ट बनाएं।

रन-टाइम अनुकूलक समाधान
एडॉप्टर का उपयोग करने वाला समाधान निम्नानुसार आगे बढ़ता है: 1. मध्यस्थ "प्रदाता" इंटरफ़ेस को परिभाषित करें, और उस प्रदाता इंटरफ़ेस के कार्यान्वयन को लिखें जो इस उदाहरण में डेटा के स्रोत, को लपेटता है, और उपयुक्त स्वरूपित डेटा को आउटपुट करता है:

2. एडेप्टर वर्ग लिखें जो प्रदाता के विशिष्ट कार्यान्वयन को लौटाता है:

3. वैश्विक रजिस्ट्री के साथ को पंजीकृत करें, जिससे को रनटाइम पर देखा जा सके:

4. कोड में, जब डेटा को से में स्थानांतरित करना हो, तो लिखें:

or more concisely:

5. इसमें लाभ देखा जा सकता है, यदि डेटा को दूसरे प्रारूप में स्थानांतरित करने की इच्छा है, तो अलग एडाप्टर/प्रदाता को देखें:

6. और यदि से डेटा को आउटपुट करने की इच्छा है, जैसे, में छवि डेटा:

7. इस तरह, एडेप्टर और प्रदाताओं के उपयोग से और द्वारा  में वर्ग पदानुक्रम में परिवर्तन किए बिना कई "विचार" की अनुमति मिलती है। सामान्य तौर पर, यह वस्तुओं के बीच इच्छित डेटा प्रवाह के लिए एक तंत्र की अनुमति देता है जिसे किसी वर्तमान वस्तु पदानुक्रम में वापस लाया जा सकता है।

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

जावा
आउटपुट:

सी#
आउटपुट:

यह भी देखें

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