2012-01-06 7 views
7

मैं सी # से जावा में आ रहा हूं जहां घटनाएं प्रथम श्रेणी के नागरिक हैं और ईवेंट हैंडलर निजी तरीके हो सकते हैं। अब मैं जावा प्रोजेक्ट पर काम कर रहा हूं जहां मुझे इवेंटिंग को लागू करने के लिए ऑब्जर्वर पैटर्न का उपयोग करने की ज़रूरत है।जावा में पर्यवेक्षक पैटर्न को लागू करते समय कार्यान्वयन विवरणों को उजागर करने से बचें?

चूंकि पर्यवेक्षक को श्रोता/हैंडलर कॉलबैक विधियों को पर्यवेक्षण वर्ग में बेनकाब करने की आवश्यकता है, ऐसा लगता है कि यह पर्यवेक्षक के विवरणों को अन्य अनिश्चित वर्गों के कार्यान्वयन का खुलासा कर रहा है। मैं पैकेज विधियों तक इन विधियों तक पहुंच सेट कर सकता हूं जो इन कार्यान्वयन विवरणों को मेरे पैकेज के उपभोक्ताओं को छिपाए रखेंगे, लेकिन यह अभी भी मेरे लिए खराब "गंध" है।

क्या यह सिर्फ कुछ है जो मुझे अपने दांतों और नंगे को गले लगाने की ज़रूरत है या क्या कोई बेहतर तरीका है?

उत्तर

9

पर्यवेक्षक पैटर्न के साथ आपके वर्ग जो देख रहे हैं उन्हें अपने कार्यान्वयन का पर्दाफाश करने की आवश्यकता नहीं है। प्रायः आपकी कक्षा जो अन्य वर्गों को अधिसूचित कर रही है, उनके अन्य लागू वर्गों के लिए अपना स्वयं का संबद्ध इंटरफ़ेस होगा।

public interface Observer 
{ 
    public void handleSomeEvent(Object someObjectOfImportance); 
} 

public class Observable 
{ 
    public void register(Observer observer); 
} 

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

public class SomeObserverImplementation implements Observer 
{ 
    public void handleSomeEvent(Object someObjectOfImportance) 
    { 
     // I can do whatever I want here 
    } 
} 

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

public class IDontWantOthersToKnowIObserve 
{ 
    private class HiddenObserver implements Observer 
    { 
     public void handleSomeEvent(Object someObjectOfImportance) 
     { 
      ... 
     } 
    } 

    ... in some method ... 
    theObservable.register(myHiddenObserver); 
} 

एक गुमनाम कार्यान्वयन का उपयोग करने के लिए:

theObservable.register(new Observer() 
      { 
       public void handleSomeEvent(Object someObjectOfImportance) 
       { 
           // ... 
       } 
      }); 
+0

धन्यवाद! बहुत बढ़िया जवाब! – HolySamosa

1

जावा में यह सामान्य रूप से के रूप में वास्तव में उजागर कार्यान्वयन विवरण के बारे में सोचा नहीं है, लेकिन, अगर तुम सच में अन्य वर्गों से अपनी कक्षा की कार्यक्षमता को छिपाना चाहते हैं तो आपको अपनी कक्षा को विभिन्न इंटरफेस लागू करने की आवश्यकता है कि प्रत्येक केवल समग्र वर्ग कार्यक्षमता का सबसेट दिखाए। यदि आप सुनिश्चित करते हैं कि अन्य वर्ग केवल एक विशेष इंटरफेस (संभवतः एक कारखाने के माध्यम से) के माध्यम से अपनी कक्षा तक पहुंचें तो आप प्रभावी ढंग से अपना कार्यान्वयन छुपाएं।

उदा:

public interface Observer<T> 
{ 
    public void notify(T event); 
} 

public interface PublicFace 
{ 
    public void doSomething(); 
} 

public class SomeClass implements Observer<Event>, PublicFace 
{ 
    public void notify(Event event) 
    { 
    // ... 
    } 

    public void doSomething() 
    { 
    // ... 
    } 
} 

public class FaceFactory 
{ 
    public static PublicFace getPublicFaceInstance() 
    { 
    return new SomeClass(); 
    } 
}