2010-12-03 9 views
7

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

स्पष्ट समाधान केवल अद्यतन विधि के अंदर "अगर उदाहरण" का उपयोग करना है, लेकिन यह जल्दी से गन्दा हो सकता है और जैसा कि मैं सोच रहा हूं कि कोई दूसरा तरीका है या नहीं?

उत्तर

7

पिछले सुझावों के समान आप को अपडेट कर सकते हैं।

public void update(Observable o, Object arg) { 
    try{ 
    Method update = getClass().getMethod(o.getClass(), Object.class); 
    update.invoke(this, o, arg); 
    } catch(Exception e) { 
    // log exception 
    } 
} 

इस तरह आप प्रत्येक प्रकार आप का पालन करना चाहते हैं के लिए एक विधि

public void update(A a, Object arg); 
public void update(B b, Object arg); 
public void update(C c, Object arg); 

जोड़ सकते हैं। दुर्भाग्य से आपको अवलोकन के सटीक ठोस प्रकार को जानने की आवश्यकता है। हालांकि आप इंटरफेस इत्यादि की अनुमति देने के लिए प्रतिबिंब बदल सकते हैं

0

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

0

आप अपने श्रोता में हमेशा Map<Class<? extends Event>, EventHandler> रख सकते हैं। इसी तरह, लेकिन कोई स्पष्ट 'exampleof' ऑपरेटर नहीं। इसे मानचित्र में containsKey() के साथ बदल दिया गया है।

12

Observer एस के रूप में कार्य करने के लिए A में एक स्वच्छ समाधान (अज्ञात) आंतरिक कक्षाओं का उपयोग करना होगा। उदाहरण के लिए:

class A { 
    public A(B b, C c) { 
     b.addObserver(new BObserver()); 
     c.addObserver(new CObserver()); 
    } 

    private class BObserver implements Observer { 
     // Logic for updates on B in update method 
    } 

    private class CObserver implements Observer { 
     // Logic for updates on C in update method 
    } 
} 

यह आपको हालांकि कई B और C रों वास्तव में आप देखना चाहते हैं कि BObserver/CObserver उदाहरणों को जोड़ने के लिए अनुमति देगा। इसमें अतिरिक्त लाभ है कि A का सार्वजनिक इंटरफ़ेस कम अव्यवस्थित है और आप D, E और F कक्षाओं को संभालने के लिए आसानी से नए आंतरिक कक्षाएं जोड़ सकते हैं।

+3

लगभग निश्चित रूप से आप अपने आंतरिक वर्गों को अज्ञात बनाना चाहते हैं। –

+0

आम तौर पर, हां, लेकिन इस उदाहरण के लिए कक्षाओं का नाम इसे थोड़ा अधिक पठनीय बनाता है। –