मैं दोनों परिभाषाएँ पढ़ रहा हूं और वे काफी समान हैं। क्या कोई बता सकता है कि उनके मतभेद क्या हैं?
धन्यवाद
मैं दोनों परिभाषाएँ पढ़ रहा हूं और वे काफी समान हैं। क्या कोई बता सकता है कि उनके मतभेद क्या हैं?
धन्यवाद
जवाबों:
फसाड पैटर्न विकि पृष्ठ इस बारे में एक संक्षिप्त नोट है।
"एक एडेप्टर का उपयोग तब किया जाता है जब रैपर को किसी विशेष इंटरफ़ेस का सम्मान करना चाहिए और एक बहुरूपी व्यवहार का समर्थन करना चाहिए। दूसरी ओर, एक मुखौटा का उपयोग तब किया जाता है जब कोई एक आसान या सरल इंटरफ़ेस के साथ काम करना चाहता है।"
मैंने एक सादृश्य सुना है कि आपको अपने सार्वभौमिक रिमोट कंट्रोल के बारे में सोचना चाहिए जो आपने अपने सभी विभिन्न स्टीरियो सिस्टम के साथ काम करने के लिए स्थापित किया है - आप "पर" दबाते हैं और यह आपके केबल बॉक्स, आपके रिसीवर और आपके टीवी पर बदल जाता है। हो सकता है कि यह वास्तव में फैंसी होम थियेटर है और यह रोशनी को कम करता है और रंगों को भी खींचता है। यह एक मुखौटा है - एक बटन / फ़ंक्शन जो चरणों के अधिक जटिल सेट की देखभाल करता है।
एडाप्टर पैटर्न सिर्फ दो असंगत इंटरफेस को जोड़ता है।
संपादित करें: एडेप्टर पैटर्न (टिप्पणियों के आधार पर) के लिए एक त्वरित सादृश्य डीवीआई-टू-वीजीए एडाप्टर की तरह कुछ हो सकता है। आधुनिक वीडियो कार्ड अक्सर डीवीआई होते हैं, लेकिन आपको एक पुराना वीजीए मॉनिटर मिला है। एक एडेप्टर के साथ जो आपके वीडियो कार्ड के अपेक्षित डीवीआई इनपुट में प्लग करता है, और इसका अपना वीजीए इनपुट है, आप अपने पुराने मॉनिटर को अपने नए वीडियो कार्ड के साथ काम कर पाएंगे।
InputStreamReader
है जो adapts InputStream
करने के लिए Reader
और OutputStreamWriter
जो adapts OutputStream
करने के लिए Writer
दोनों जो विभिन्न सार प्रकार हैं।
ईमानदारी से, कई पैटर्न को उसी तरह से प्रोग्रामेटिक रूप से लागू किया जा सकता है - अंतर इरादे में है।
एडेप्टर डिज़ाइन पैटर्न एक या एक से अधिक कक्षाओं के इंटरफ़ेस को एक इंटरफ़ेस में 'ट्रांसलेट' करने के लिए होता है, जिसे ग्राहक उपयोग करने की उम्मीद करता है - एडाप्टर कॉल को ट्रांसलेटेड क्लासेस के वास्तविक इंटरफ़ेस में अपेक्षित इंटरफ़ेस में ट्रांसलेट करेगा।
जब एक सरल इंटरफ़ेस वांछित होता है (और फिर से, आपत्तिजनक कक्षाओं को लपेटकर उसी तरह लागू किया जा सकता है) मुखौटा पैटर्न का उपयोग किया जाता है। आप यह नहीं कहेंगे कि जब मौजूदा ज़रूरत होती है, तो आप एक मुखौटा का उपयोग कर रहे होते हैं। इसे और अधिक पठनीय बनाने के लिए, कम खराब डिजाइन वाले, आदि।
फसाड:
प्रमुख टेकअवे: ( पंकज कुमार द्वारा लेखदेव के लेख से)
मुखौटा वर्ग आरेख:
एडाप्टर:
एडाप्टर का वर्ग आरेख:
आप इस एसई पोस्ट में एडेप्टर के बारे में अधिक जानकारी प्राप्त कर सकते हैं:
ब्रिज पैटर्न और एडेप्टर पैटर्न के बीच अंतर
मुख्य अंतर:
बेहतर समझ के लिए सोर्समेकिंग लेख पर भी एक नज़र डालें ।
someMethod(int year, int month)
सौंपा गया था someMethod(DateTime start, DateTime end)
या मान लीजिए कि someMethod()
को प्रत्यायोजितsomeMethod(T param)
एक मुखौटा को एक सेवा गेटवे के पीछे कई सेवाओं को व्यवस्थित करने के लिए डिज़ाइन किया गया है। एक एडेप्टर को किसी अज्ञात को एक्सेस करने के लिए ज्ञात इंटरफ़ेस का उपयोग करने का एक तरीका प्रदान करने के लिए डिज़ाइन किया गया है।
एक का उद्देश्य
मुखौटा है सादगी
एडाप्टर है अंतर ।
मुखौटा आमतौर पर एडेप्टर के साथ विपरीत होता है।
+--------------------------------------------------------------+-----------------------------------------------+
| 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 |
+--------------------------------------------------------------+-----------------------------------------------+
हमेशा की तरह, कई पैटर्न के बीच समानताएं मौजूद हैं। लेकिन मैं इसे इस तरह देखूंगा:
मैं इसे बिना किसी औपचारिकता के स्पष्ट शब्दों में समझाने की कोशिश करूँगा।
कल्पना कीजिए कि आपने कुछ डोमेन कक्षाएं प्राप्त की हैं और UI से आप उनके साथ बातचीत करना चाहते हैं। फ़ंक्शन को यूआई लेयर से कॉल करने के लिए उपयोग किया जा सकता है, ताकि यूआई लेयर को फेसडे के अलावा किसी भी अन्य डोमेन के बारे में पता न चले। इसका मतलब यह है कि डोमेन कक्षाओं में फ़ंक्शन को कॉल करने के बजाय आप फ़ंक्शन को एकल फ़ंक्शन से कॉल करते हैं, जो अन्य कक्षाओं से आवश्यक फ़ंक्शन को कॉल करने के लिए ज़िम्मेदार होगा।
दूसरी ओर, एक एडेप्टर का उपयोग अन्य बाहरी घटकों को एकीकृत करने के लिए किया जा सकता है जिनकी आपके पास समान कार्यक्षमता हो सकती है लेकिन उनके कार्यों को समान रूप से नहीं कहा जाता है। मान लें कि आपने Car
अपने डोमेन में एक वर्ग प्राप्त किया है और आप एक बाहरी कार प्रदाता के साथ काम करते हैं जिसमें एक कार वर्ग भी परिभाषित है। इस वर्ग में, आपको फ़ंक्शन मिल गया है car.getDoors()
लेकिन बाहरी प्रदाता के समकक्ष है car.getNumDoors()
। आप इस फ़ंक्शन को कॉल करने के तरीके को बदलना नहीं चाहते हैं, इसलिए आप बाहरी कार वर्ग को लपेटने के लिए एक एडेप्टर क्लास का उपयोग कर सकते हैं ताकि एडेप्टर के लिए कॉल बाहरी वर्ग getDoors()
को सौंप दिया जाए getNumDoors()
।
एडाप्टर पैटर्न दो, पहले से असंगत, इंटरफेस को एक दूसरे के साथ काम करने की अनुमति देता है। खेलने में 2 अलग इंटरफेस है।
मुखौटा पैटर्न एक ज्ञात इंटरफ़ेस लेता है, जो निम्न स्तर / ठीक दाने वाला होता है, और इसे उच्च स्तर / पाठ्यक्रम दानेदार इंटरफ़ेस के साथ लपेटता है। एक एकल इंटरफ़ेस है, जिसे दूसरे के साथ लपेटकर सरल बनाया गया है।
एडॉप्टर दो इंटरफेस को एक साथ काम करता है।
मुखौटा एकल वर्ग को उच्च, और अधिक सीमित स्तर तक उजागर करता है। उदाहरण के लिए, एक दृश्य मॉडल मुखौटा केवल निम्न स्तर के वर्ग के कुछ पढ़े गए गुणों को ही उजागर कर सकता है।
मुखौटा
एक सरल इंटरफ़ेस प्रदान करने के लिए सार जटिलता। उदाहरण के लिए, एक कंप्यूटर ओएस अंतर्निहित हार्डवेयर की जटिलता को रोकता है। या निम्न-स्तरीय भाषा (C) की तुलना में एक उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज (पायथन / जावास्क्रिप्ट) अमूर्त जटिलता।
अनुकूलक
यह एक हार्डवेयर एडेप्टर का एनालॉग है। यदि आप एक कनेक्ट करना चाहते हैं का कहना है कि USB device
एक के लिए serial port
, आप एक की आवश्यकता होगी USB-serial port adapter
।
एडेप्टर पैटर्न एक नया इंटरफ़ेस प्रदान करके दो असंगत इंटरफेस को जोड़ता है।
मुखौटा पैटर्न एक इंटरफ़ेस के साथ एक जटिल सबसिस्टम (कई घटक वाले) को सरल करता है।
इन दोनों पैटर्न के बीच अंतर स्पष्ट है, लेकिन डिज़ाइन पैटर्न के दायरे में नहीं, बल्कि डोमेन मॉडलिंग। निम्नलिखित में, मैं समझाता हूँ कि क्यों।
सबसे पहले, मैं दूसरों को यहाँ कहा गया दोहराना चाहता हूं, और फिर मैं नोट जोड़ूंगा:
एक मुखौटा एक सबसिस्टम (एक बाहरी या एक विरासत प्रणाली) के लिए एक इंटरफ़ेस है जो क्लाइंट (हमें) के लिए उपयोग को सरल करता है। मुखौटा अन्य सबसिस्टम के इंटरफ़ेस को छुपाता है (कुछ कॉलों को एग्रीगेट करें, या कुछ API को छिपाएं जिनकी हमें आवश्यकता नहीं है), इस प्रकार आपका क्लाइंट इस सबसाइड के माध्यम से केवल उस सबसिस्टम तक पहुँच प्राप्त करता है।
दूसरी ओर, एक एडेप्टर किसी अन्य सेवा या ऑब्जेक्ट के आसपास एक आवरण है। यह लिपटे ऑब्जेक्ट को एक मानक इंटरफ़ेस के अनुरूप बनाता है जो क्लाइंट को उम्मीद है। मान लें कि "लेजर" ऑब्जेक्ट पर एक विधि है, जिसे आपको एक ट्विस्ट करने की आवश्यकता है (इसके मापदंडों को बदलें, इसका नाम बदलें, आदि)। आप इसे एडॉप्टर से लपेट सकते हैं।
अब, अभी भी अंतर स्पष्ट नहीं हो सकता है। यही कारण है कि मैं आगे के भ्रम के लिए कोई जगह नहीं छोड़ते हुए इन दो पैटर्नों के बीच महत्वपूर्ण अंतर लाना चाहता हूं :
फेशियल अन्य सबसिस्टम के डोमेन मॉडल को नहीं बदलता है, जबकि एडेप्टर करता है। यह महत्वपूर्ण अंतर है। अवधि।
इसीलिए जब आप एंटीकरप्शन लेयर बनाते हैं तो आप इन दोनों को मिला देते हैं । मान लें कि आपके पास सबसिस्टम है जिसका आप उपयोग करना चाहते हैं, लेकिन आप नहीं चाहते कि इसका डोमेन मॉडल आपके डोमेन मॉडल को मसल दे। तुम क्या करोगे? आप एक एंटीकॉरपेशन लेयर बनाएँगे। कैसे? आप पहले एक मुखौटा बनाते हैं, जो सबसिस्टम के लिए इंटरफ़ेस तक पहुँचने को आसान बनाता है, और फिर उस इंटरफ़ेस में उपयोग की जाने वाली डोमेन ऑब्जेक्ट के लिए एडेप्टर (याद रखें कि मुखौटा अभी भी अन्य सबसिस्टम के लिए डोमेन मॉडल रखता है), इसलिए यह आपके मॉडल के अनुरूप है।
डोमेन मॉडलिंग में कई डिज़ाइन पैटर्न का उपयोग किया जा सकता है। यह मुखौटा और एडाप्टर डिजाइन पैटर्न के लिए सच है, साथ ही साथ। हालाँकि इन दोनों पैटर्न के बीच का अंतर "डिज़ाइन पैटर्न" क्षेत्र में स्पष्ट नहीं हो सकता है, लेकिन यह "डोमेन मॉडलिंग" क्षेत्र में अधिक स्पष्ट है।
मैं दोनों परिभाषाएँ पढ़ रहा हूं और वे काफी समान हैं।
वास्तव में ?
मैंने देखा है कि एडेप्टर शब्द का उपयोग कभी-कभी यह बताने के लिए किया जाता है कि वास्तव में एक स्टैटेजी क्या है , शायद इसलिए कि शब्द अधिक अभिव्यंजक है।
उदाहरण के लिए, Zend फ्रेमवर्क में , सभी एडेप्टर कक्षाएं वास्तव में स्ट्रैटेजी पैटर्न के कार्यान्वयन हैं , क्योंकि वे केवल कक्षाओं के पीछे मूल कोड लपेटते हैं, जिसमें कई व्यवहार होते हैं।
एडेप्टर का उपयोग अक्सर विरासत या "पुरानी शैली" कोड को लपेटने के लिए किया जाता है।