मुखौटा, प्रॉक्सी, एडाप्टर और डेकोरेटर डिजाइन पैटर्न के बीच अंतर? [बन्द है]


135

मुखौटा, प्रॉक्सी, एडाप्टर और डेकोरेटर डिज़ाइन पैटर्न के बीच अंतर क्या है?

मैंने कभी स्पष्ट स्पष्टीकरण नहीं पढ़ा, आपका क्या है?



@gavenkoa अन्य सवाल केवल प्रॉक्सी और डेकोरेटर के बारे में है
user310291

2
कुछ बंद प्रश्न के रूप में अविश्वसनीय खुद को इतना उपयोगी बताता है।
ल्यूक

जवाबों:


285

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

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

प्रॉक्सी प्रॉक्सी-क्लास के लिए समान इंटरफ़ेस प्रदान करता है और आम तौर पर कुछ हाउसकीपिंग सामान अपने आप करता है। (इसलिए एक भारी वस्तु की कई प्रतियां बनाने के बजाय Xआप एक हल्के प्रॉक्सी की प्रतियां बनाते हैं Pजो बदले में Xआपकी कॉल का प्रबंधन करता है और आवश्यकतानुसार अनुवाद करता है।) आप क्लाइंट की समस्या को एक भारी और / या जटिल वस्तु का प्रबंधन करने से हल कर रहे हैं ।

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

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

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


1
HTH! मैंने बहुत अस्पष्ट होने के बिना जितना संभव हो उतना अंदर डालने की कोशिश की है। बेहतर करने में मेरी असमर्थता का बहाना करो। मैंने अकेले लक्षणों पर (पीएचडी शोध प्रबंध) पेपर पढ़ा है। मेरा ज्ञान इसलिए सीमित है और मैं इस स्थान पर सभी पैटर्न में फिट होने के लिए पर्याप्त नहीं हूं;)
dirkgently

आपने मिश्रण और लक्षणों के बारे में भविष्य के प्रश्न का अनुमान लगाया था, लेकिन मैंने उन्हें अभी तक नहीं देखा है!
user310291

1
पहले तीन के लिए एक अच्छी तुलना लिंक (विकिपीडिया के माध्यम से) (डेकोरेटर काफी अलग है): नेटऑब्जेक्टिव
Liviu

@Liviu आपका लिंक मर चुका है। मुझे लगता है कि आप मूल रूप से इशारा कर रहे थे वहाँ , लेकिन सामग्री अब एक लॉगिन के पीछे लगती है।
जोनाथन एच

@ शलजोह लिंक को अपडेट किया गया: p: पहले तीन के लिए एक अच्छी तुलना लिंक (विकिपीडिया के माध्यम से) (डेकोरेटर काफी अलग है) NetObjectives (पाठ Retreiveing, "betweem" देखें: "अधिक लगातार सवाल मैं कक्षा में मिल में से एक है" क्या अंतर betweem एडाप्टर, प्रॉक्सी, और मुखौटा। वे वास्तव में मेरे लिए समान लगते हैं "।)
Liviu

16

मुखौटा

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

अनुकूलक

इसका एक अच्छा उदाहरण विकिपीडिया पर यहाँ देखा जा सकता है । एक क्लाइंट ऑब्जेक्ट Sourceकिसी अन्य ऑब्जेक्ट पर एक विधि को कॉल करना चाहेगा Target, लेकिन उस अन्य ऑब्जेक्ट का इंटरफ़ेस अलग है जो क्लाइंट की अपेक्षा कर रहा है।

एडॉप्टर ऑब्जेक्ट दर्ज करें।

यह Sourceऑब्जेक्ट से कॉल ले सकता है और, पर्दे के पीछे, उस Targetविधि को कॉल करें जिसका उपयोग किया जाना चाहिए।

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

प्रॉक्सी के रूप में, मुझे इस डिज़ाइन पैटर्न का कोई अनुभव नहीं है।

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