मुखौटा और एडाप्टर पैटर्न के बीच अंतर क्या है?


जवाबों:


142

फसाड पैटर्न विकि पृष्ठ इस बारे में एक संक्षिप्त नोट है।

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

मैंने एक सादृश्य सुना है कि आपको अपने सार्वभौमिक रिमोट कंट्रोल के बारे में सोचना चाहिए जो आपने अपने सभी विभिन्न स्टीरियो सिस्टम के साथ काम करने के लिए स्थापित किया है - आप "पर" दबाते हैं और यह आपके केबल बॉक्स, आपके रिसीवर और आपके टीवी पर बदल जाता है। हो सकता है कि यह वास्तव में फैंसी होम थियेटर है और यह रोशनी को कम करता है और रंगों को भी खींचता है। यह एक मुखौटा है - एक बटन / फ़ंक्शन जो चरणों के अधिक जटिल सेट की देखभाल करता है।

एडाप्टर पैटर्न सिर्फ दो असंगत इंटरफेस को जोड़ता है।

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


4
रिमोट कंट्रोल का उपयोग करते हुए महान सादृश्य। एडाप्टर पैटर्न स्पष्टीकरण ठीक है, लेकिन एक ही तरह की सादृश्य के साथ आना बहुत अच्छा होगा।
केविन ले - खन्नले

2
बहुत बढ़िया सादृश्य! : एडाप्टर पैटर्न का एक वास्तविक दुनिया जावा उदाहरण यह बेहतर ढंग से समझने में मदद मिल सकती InputStreamReaderहै जो adapts InputStreamकरने के लिए Readerऔर OutputStreamWriterजो adapts OutputStreamकरने के लिए Writerदोनों जो विभिन्न सार प्रकार हैं।
बालुस ०

1
@Khnle - कार्रवाई में एडाप्टर पैटर्न: upload.wikimedia.org/wikipedia/commons/8/80/…
एरिक पेट्रॉलेज

@Khnle - एक एडेप्टर सादृश्य में जोड़ा गया (व्यक्तिगत अनुभव के आधार पर)। @ एरिक - प्रेरणा और महान तस्वीर के लिए धन्यवाद! @BalusC - वास्तविक दुनिया उदाहरण पर अच्छी कॉल।
२०:१० को ashepard

@ बालसु - मुझे आपका उदाहरण भी पसंद है। सौभाग्य से मुझे जावा पता है। @ एरिक पेट्रोल्जे - एक तस्वीर हजार शब्दों के लायक है :-) @awshepard - अगर मैंने प्रोग्रामिंग नहीं की है, तो अब मैं आपके स्पष्टीकरण का अनुसरण कर सकता हूं :-)
केविन ले - खनेले

125

एडाप्टर == एक चौकोर खूंटी को गोल छेद में फिट करना।

मुखौटा == सभी आंतरिक घटकों को चलाने के लिए एक एकल नियंत्रण कक्ष।


8
उस उत्तर को पूर्णता के लिए खो दिया गया है! मैं अपने पैटर्न नोट्स में शामिल हूं। :)
जोशुआ डेल

1
सादगी में महानता
एक आदमी

20

ईमानदारी से, कई पैटर्न को उसी तरह से प्रोग्रामेटिक रूप से लागू किया जा सकता है - अंतर इरादे में है।

एडेप्टर डिज़ाइन पैटर्न एक या एक से अधिक कक्षाओं के इंटरफ़ेस को एक इंटरफ़ेस में 'ट्रांसलेट' करने के लिए होता है, जिसे ग्राहक उपयोग करने की उम्मीद करता है - एडाप्टर कॉल को ट्रांसलेटेड क्लासेस के वास्तविक इंटरफ़ेस में अपेक्षित इंटरफ़ेस में ट्रांसलेट करेगा।

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


18

फसाड:

प्रमुख टेकअवे: ( पंकज कुमार द्वारा लेखदेव के लेख से)

  1. मुखौटा पैटर्न क्लाइंट अनुप्रयोगों के लिए सहायक की तरह अधिक है
  2. मुखौटा पैटर्न को विकास के किसी भी बिंदु पर लागू किया जा सकता है, आमतौर पर जब इंटरफेस की संख्या बढ़ती है और सिस्टम जटिल हो जाता है
  3. सबसिस्टम इंटरफेस फेसडे के बारे में नहीं जानते हैं और उनके पास फेकडे इंटरफेस का कोई संदर्भ नहीं होना चाहिए
  4. इसी तरह के इंटरफेस के लिए मुखौटा पैटर्न लागू किया जाना चाहिए , इसका उद्देश्य एक ही इंटरफ़ेस प्रदान करना है जो कई इंटरफेसों के बजाय एक ही तरह का काम करता है

मुखौटा वर्ग आरेख:

यहां छवि विवरण दर्ज करें

एडाप्टर:

  1. यह एक संरचनात्मक पैटर्न है
  2. यह दो के साथ काम करने के लिए उपयोगी है असंगत इंटरफेस के
  3. यह चीजों को डिज़ाइन करने के बाद काम करता है

एडाप्टर का वर्ग आरेख:

यहां छवि विवरण दर्ज करें

आप इस एसई पोस्ट में एडेप्टर के बारे में अधिक जानकारी प्राप्त कर सकते हैं:

ब्रिज पैटर्न और एडेप्टर पैटर्न के बीच अंतर

मुख्य अंतर:

  1. मुखौटा एक नया इंटरफ़ेस परिभाषित करता है, जबकि एडाप्टर एक पुराने इंटरफ़ेस का उपयोग करता है । एडेप्टर दो मौजूदा इंटरफेस को एक साथ काम करने के लिए एक पूरी तरह से नया परिभाषित करने के विपरीत बनाता है
  2. एडाप्टर और मुखौटा दोनों रैपर हैं; लेकिन वे विभिन्न प्रकार के रैपर हैं। Facade का इरादा एक सरल इंटरफ़ेस का उत्पादन करना है, और Adapter का इरादा मौजूदा इंटरफ़ेस को डिज़ाइन करना है

बेहतर समझ के लिए सोर्समेकिंग लेख पर भी एक नज़र डालें ।


आरेख देखने के लिए प्यार! हालांकि कुछ स्पष्टीकरण, जब मैं संख्या / प्रकार के मापदंडों को बदलता हूं तो क्या इसका मतलब है कि इसका कोई एडेप्टर नहीं है? जैसे someMethod(int year, int month) सौंपा गया था someMethod(DateTime start, DateTime end)या मान लीजिए कि someMethod()को प्रत्यायोजितsomeMethod(T param)
जैमे Sangcap

यदि दोनों विधियाँ एक ही कक्षा में हैं, तो इसे ओवरलोडिंग कहा जाता है। यदि वे अलग-अलग कक्षाओं में हैं, तो एडेप्टर हो सकता है यदि एडेप्टर और एडेपेटी संबंध कार्यान्वित किया जाता है
रवींद्र बाबू

वास्तव में अच्छी व्याख्या।
ड्यूक फिलन

14

एक मुखौटा को एक सेवा गेटवे के पीछे कई सेवाओं को व्यवस्थित करने के लिए डिज़ाइन किया गया है। एक एडेप्टर को किसी अज्ञात को एक्सेस करने के लिए ज्ञात इंटरफ़ेस का उपयोग करने का एक तरीका प्रदान करने के लिए डिज़ाइन किया गया है।



8

मुखौटा आमतौर पर एडेप्टर के साथ विपरीत होता है।

+--------------------------------------------------------------+-----------------------------------------------+
|                            Facade                            |                    Adapter                    |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components                               | Works with single component                   |
| Control panel is an example                                  | A power adapter is an example                 |
| High-level interface                                         | Low-level interface                           |
+--------------------------------------------------------------+-----------------------------------------------+

4

हमेशा की तरह, कई पैटर्न के बीच समानताएं मौजूद हैं। लेकिन मैं इसे इस तरह देखूंगा:

  • एक मुखौटा का उपयोग पूरी परत को एनकैप्सुलेट करने के लिए किया जाता है, और इसे "आसानी से" एक्सेस करने के लिए कुछ तरीके प्रदान करते हैं।
  • एक एडाप्टर का उपयोग किया जाता है, जहां आपके पास दो घटक हैं जो पहले से ही एक साथ काम करना चाहिए, लेकिन इंटरफ़ेस में कुछ "महत्वहीन" मतभेदों के कारण ही नहीं।

1
अच्छे खर्च। एडेप्टर का वर्णन करते समय मैं "महत्वहीन अंतर" शब्द के साथ पहली बार आया हूं, जो कि
सटीक

4

मैं इसे बिना किसी औपचारिकता के स्पष्ट शब्दों में समझाने की कोशिश करूँगा।

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

दूसरी ओर, एक एडेप्टर का उपयोग अन्य बाहरी घटकों को एकीकृत करने के लिए किया जा सकता है जिनकी आपके पास समान कार्यक्षमता हो सकती है लेकिन उनके कार्यों को समान रूप से नहीं कहा जाता है। मान लें कि आपने Carअपने डोमेन में एक वर्ग प्राप्त किया है और आप एक बाहरी कार प्रदाता के साथ काम करते हैं जिसमें एक कार वर्ग भी परिभाषित है। इस वर्ग में, आपको फ़ंक्शन मिल गया है car.getDoors()लेकिन बाहरी प्रदाता के समकक्ष है car.getNumDoors()। आप इस फ़ंक्शन को कॉल करने के तरीके को बदलना नहीं चाहते हैं, इसलिए आप बाहरी कार वर्ग को लपेटने के लिए एक एडेप्टर क्लास का उपयोग कर सकते हैं ताकि एडेप्टर के लिए कॉल बाहरी वर्ग getDoors()को सौंप दिया जाए getNumDoors()


3

एडाप्टर पैटर्न दो, पहले से असंगत, इंटरफेस को एक दूसरे के साथ काम करने की अनुमति देता है। खेलने में 2 अलग इंटरफेस है।

मुखौटा पैटर्न एक ज्ञात इंटरफ़ेस लेता है, जो निम्न स्तर / ठीक दाने वाला होता है, और इसे उच्च स्तर / पाठ्यक्रम दानेदार इंटरफ़ेस के साथ लपेटता है। एक एकल इंटरफ़ेस है, जिसे दूसरे के साथ लपेटकर सरल बनाया गया है।


3

एडॉप्टर दो इंटरफेस को एक साथ काम करता है।

मुखौटा एकल वर्ग को उच्च, और अधिक सीमित स्तर तक उजागर करता है। उदाहरण के लिए, एक दृश्य मॉडल मुखौटा केवल निम्न स्तर के वर्ग के कुछ पढ़े गए गुणों को ही उजागर कर सकता है।


1

मुखौटा

एक सरल इंटरफ़ेस प्रदान करने के लिए सार जटिलता। उदाहरण के लिए, एक कंप्यूटर ओएस अंतर्निहित हार्डवेयर की जटिलता को रोकता है। या निम्न-स्तरीय भाषा (C) की तुलना में एक उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज (पायथन / जावास्क्रिप्ट) अमूर्त जटिलता।

अनुकूलक

यह एक हार्डवेयर एडेप्टर का एनालॉग है। यदि आप एक कनेक्ट करना चाहते हैं का कहना है कि USB deviceएक के लिए serial port, आप एक की आवश्यकता होगी USB-serial port adapter


1

एडेप्टर पैटर्न एक नया इंटरफ़ेस प्रदान करके दो असंगत इंटरफेस को जोड़ता है।

मुखौटा पैटर्न एक इंटरफ़ेस के साथ एक जटिल सबसिस्टम (कई घटक वाले) को सरल करता है।


1

इन दोनों पैटर्न के बीच अंतर स्पष्ट है, लेकिन डिज़ाइन पैटर्न के दायरे में नहीं, बल्कि डोमेन मॉडलिंग। निम्नलिखित में, मैं समझाता हूँ कि क्यों।

सबसे पहले, मैं दूसरों को यहाँ कहा गया दोहराना चाहता हूं, और फिर मैं नोट जोड़ूंगा:

एक मुखौटा एक सबसिस्टम (एक बाहरी या एक विरासत प्रणाली) के लिए एक इंटरफ़ेस है जो क्लाइंट (हमें) के लिए उपयोग को सरल करता है। मुखौटा अन्य सबसिस्टम के इंटरफ़ेस को छुपाता है (कुछ कॉलों को एग्रीगेट करें, या कुछ API को छिपाएं जिनकी हमें आवश्यकता नहीं है), इस प्रकार आपका क्लाइंट इस सबसाइड के माध्यम से केवल उस सबसिस्टम तक पहुँच प्राप्त करता है।

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

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

फेशियल अन्य सबसिस्टम के डोमेन मॉडल को नहीं बदलता है, जबकि एडेप्टर करता है। यह महत्वपूर्ण अंतर है। अवधि।

इसीलिए जब आप एंटीकरप्शन लेयर बनाते हैं तो आप इन दोनों को मिला देते हैं । मान लें कि आपके पास सबसिस्टम है जिसका आप उपयोग करना चाहते हैं, लेकिन आप नहीं चाहते कि इसका डोमेन मॉडल आपके डोमेन मॉडल को मसल दे। तुम क्या करोगे? आप एक एंटीकॉरपेशन लेयर बनाएँगे। कैसे? आप पहले एक मुखौटा बनाते हैं, जो सबसिस्टम के लिए इंटरफ़ेस तक पहुँचने को आसान बनाता है, और फिर उस इंटरफ़ेस में उपयोग की जाने वाली डोमेन ऑब्जेक्ट के लिए एडेप्टर (याद रखें कि मुखौटा अभी भी अन्य सबसिस्टम के लिए डोमेन मॉडल रखता है), इसलिए यह आपके मॉडल के अनुरूप है।

डोमेन मॉडलिंग में कई डिज़ाइन पैटर्न का उपयोग किया जा सकता है। यह मुखौटा और एडाप्टर डिजाइन पैटर्न के लिए सच है, साथ ही साथ। हालाँकि इन दोनों पैटर्न के बीच का अंतर "डिज़ाइन पैटर्न" क्षेत्र में स्पष्ट नहीं हो सकता है, लेकिन यह "डोमेन मॉडलिंग" क्षेत्र में अधिक स्पष्ट है।


0

मैं दोनों परिभाषाएँ पढ़ रहा हूं और वे काफी समान हैं।

वास्तव में ?

मैंने देखा है कि एडेप्टर शब्द का उपयोग कभी-कभी यह बताने के लिए किया जाता है कि वास्तव में एक स्टैटेजी क्या है , शायद इसलिए कि शब्द अधिक अभिव्यंजक है।

उदाहरण के लिए, Zend फ्रेमवर्क में , सभी एडेप्टर कक्षाएं वास्तव में स्ट्रैटेजी पैटर्न के कार्यान्वयन हैं , क्योंकि वे केवल कक्षाओं के पीछे मूल कोड लपेटते हैं, जिसमें कई व्यवहार होते हैं।

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


0

मुखौटा पैटर्न का मुख्य लक्ष्य क्लास या सबसिस्टम का उपयोग करना आसान बनाना है, जबकि एडेप्टर पैटर्न का मुख्य लक्ष्य इंटरफ़ेस को समायोजित करना है जो ग्राहक की अपेक्षा करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.