2010-08-24 9 views
6

मेरे पास एक इंटरफ़ेस है - "EventHandler" - जो कई विधियों की घोषणा करता है। "EventHandlerAdapter" - - कि eventhandler लागू करताक्या यह वास्तव में एडाप्टर पैटर्न का एक उदाहरण है?

public interface EventHandler { 
    void handleEvent1(); 

    void handleEvent2(); 

    void handleEvent3(); 

    void handleEvent4(); 
} 

मैं भी एक वर्ग है। हालांकि, यह वास्तव में कुछ भी "लागू" नहीं करता है। मुद्दा यह है कि, यदि कोई और वर्ग इवेंट हैंडलर को कार्यान्वित करना चाहता है, लेकिन इसके सभी तरीकों से नहीं, तो यह आसानी से इवेंट हैडलर एडाप्टर का विस्तार कर सकता है और केवल उन्हीं विधियों को ओवरराइड कर सकता है।

public class EventHandlerAdapter implements EventHandler { 
    public void handleEvent1() {} 

    public void handleEvent2() {} 

    public void handleEvent3() {} 

    public void handleEvent4() {} 
} 

मैं एक से अधिक अवसर पर कुछ इस तरह देखा है। "EventHandlerAdapter" नाम से मुझे पता चलता है कि यह एडाप्टर पैटर्न का एक उदाहरण है ... लेकिन क्या यह वास्तव में है? मैंने सोचा कि एडाप्टर का बिंदु किसी मौजूदा कार्यान्वयन को किसी अन्य चीज़ में अनुवाद करना था। मैं नहीं देखता कि यह मामला कैसा है।

यदि यह एडाप्टर पैटर्न का उदाहरण नहीं है, तो यह क्या है? निश्चित रूप से इस तरह की कुछ पहचान की गई है।

उत्तर

8

नहीं, यह एक एडाप्टर पैटर्न का एक उदाहरण के रूप में यहां परिभाषित नहीं किया है,:

http://en.wikipedia.org/wiki/Adapter_pattern

हालांकि, जावा घटना से निपटने में, शब्द एडाप्टर अक्सर इस्तेमाल किया जाता है के रूप में आप का उल्लेख किया। भले ही "एडाप्टर" शब्द दोनों में समान है, फिर भी वे एक ही बात का उल्लेख नहीं करते हैं। Java.awt.event पैकेज में दिखाई देने वाले एडाप्टर वहां एक ईवेंट हैंडलर बनाना आसान बनाता है जो खाली विधियों का एक समूह लिखने के बिना केवल एक विधि को संभालता है। वे केवल शॉर्टकट कक्षाएं हैं।

जावा इवेंट एपीआई आमतौर पर इन कक्षाओं के लिए लगातार नामकरण करता है। जब SomeEvent इवेंट क्लास होता है, तो ईवेंट को सुनने के लिए SomeListener इंटरफ़ेस होता है और SomeAdapter क्लास खाली विधियों के साथ श्रोता इंटरफ़ेस को कार्यान्वित करता है। इन सभी तीनों घटनाओं में इन तीनों हिस्सों में नहीं है, लेकिन तीनों के नामकरण और कार्य में स्थिरता है।

आपके द्वारा प्रदान किए गए उदाहरण में, मैं मौजूदा जावा एपीआई के अनुरूप होने के लिए कक्षा EventAdapter का नाम बदलूंगा।

+0

हाँ, स्थिरता एक अच्छी बात है;) – Bozho

+0

कुछ सोचने के बाद, मैंने फैसला किया है कि "AbstractEventHandler" जैसे कुछ अधिक उपयुक्त है। यह संगत नहीं हो सकता है, लेकिन वास्तव में, जावा एपीआई स्वयं भी संगत है? – someguy

+1

@ सोमेगुय, सार सार * का अर्थ है कि वर्ग 'सार' है, इस प्रकार यह उपयोग करने के लिए _must_ को उप-वर्गीकृत किया जाना चाहिए। जैसे जावा संग्रह फ्रेमवर्क में ऐसे कई वर्ग शामिल हैं। इस मामले में, कक्षा उपयोग योग्य है, और यह _may_ subclassed हो। तो मेरे लिए नाम भ्रामक होगा। –

2

आप सही हैं, यह एडाप्टर के एक छोटे से डिफ़ॉल्ट कार्यान्वयन के बजाय एडाप्टर डिज़ाइन पैटर्न का उदाहरण नहीं है। मैं इसे DefaultEventHandler, EmptyEventHandler या GenericEventHandler पर पुनर्नामित कर दूंगा।

+0

यह जावा एपीआई के अनुरूप नहीं होगा। –

+0

और मुझे लगता है कि आप एक ही फैशन में जावा कक्षाओं का नाम भी देंगे :) (+1) – Bozho

+0

@ एरिक, मैंने अभी इस नामकरण सम्मेलन के बारे में अन्य उत्तरों से सीखा - यह जानना अच्छा है :-) मैं अभी भी बनाए रखता हूं कि ' DefaultEventHandler' et al।'EventHandlerAdapter' से बेहतर नाम है क्योंकि यह संदिग्ध नहीं है। जावा इवेंट हैंडलिंग सम्मेलनों में जो लोग नहीं जानते हैं, वे इस एडाप्टर द्वारा परेशान हैं, जबकि आईएमएचओ को अन्य शिविर में डिफ़ॉल्ट * वर्ग नाम को समझने में समस्या नहीं होगी। क्या नामकरण सम्मेलन में रहना बेहतर है, भले ही यह संदिग्ध हो, या क्या इसे ठीक करना बेहतर है? मैं उत्तरार्द्ध पसंद करता हूं, लेकिन निश्चित रूप से अन्य लोगों की अलग-अलग प्राथमिकताएं हो सकती हैं। –

2

आप सही हैं, यह एडाप्टर पैटर्न का एक उदाहरण नहीं है, लेकिन एक व्यापक रूप से अपनाया सम्मेलन है बुलाया "एडाप्टर"

उदाहरण जावा यूआई एपीआई के लिए अक्सर MouseListener इंटरफेस के लिए इस तरह के एडेप्टर प्रदान "के लिए खाली डिफ़ॉल्ट" के लिए।

2

एडब्ल्यूटी में इंटरफेस के बहुत सारे कार्यान्वयन हैं जिन्हें वे "एडाप्टर" कहते हैं, जैसे 'माउस एडाप्टर', 'फोकस एडाप्टर'। और नहीं, वे एडाप्टर पैटर्न के कार्यान्वयन नहीं कर रहे हैं। वे सुविधा वर्ग हैं, मैं बस उन्हें stubs कहूंगा।