2013-02-22 92 views
5

में प्रतिनिधि पैटर्न (जैसे उद्देश्य-सी) को कार्यान्वित करने के लिए कैसे मैंने एक उदाहरण देखा जहां जावा के लिए प्रतिनिधिमंडल पैटर्न समझाया गया है। इसके लिए ज्यादा उपयोग नहीं मिला (अज्ञानता से बहाना) क्योंकि मुझे लगता है कि इसमें उद्देश्य-लचीलापन की कमी है। प्रतिनिधि वस्तु को गतिशील रूप से सेट करने का कोई तरीका है क्योंकि कोई उद्देश्य-सी में कर सकता है। क्या वह प्रतिनिधिमंडल का पूरा बिंदु नहीं है? जावा का मेरा ज्ञान बहुत प्रारंभिक है, इसलिए कृपया थोड़ा विस्तार से समझाएं।जावा

+0

[जावा AWT घटना वास्तुकला] (http://docs.oracle.com/javase/1.4.2/docs/guide/awt/1.3/designspec/events.html) प्रतिनिधिमंडल मॉडल कार्यरत हैं। हो सकता है कि आप उस लिंक किए गए दस्तावेज़ को पढ़ सकें। – Perception

+0

@ धारणा: मैंने लिंक की जांच की। दिए गए कोड उदाहरण में, यह आवश्यक नहीं है कि पारित प्रतिनिधि हमेशा 'ऐप' प्रकार का होना चाहिए। लचीलापन से मेरा यही मतलब है। या क्या मैं ऐप ऑब्जेक्ट प्रतिनिधि के बारे में पूरी तरह से गलत हूं? – Rakesh

+0

कुछ दिन पहले http://stackoverflow.com/questions/14963740/cast-to-implemented-class/14963939#14963939 मैंने एक उदाहरण के साथ प्रतिनिधिमंडल पैटर्न को स्केच किया, आप इसे देख सकते थे। – gaborsch

उत्तर

8

मुझे लगता है कि जावा में प्रतिनिधिमंडल पैटर्न को लागू करने के कई तरीके हैं, लेकिन शायद कोई भी जो अंतर्निहित नहीं है।

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

अब आपके पास कौन से टूल्स हैं और इसका उपयोग कर सकते हैं, इस पर निर्भर करते हुए, आप अग्रेषण अधिक स्वचालित कर सकते हैं। एक विचार, पहलू उन्मुख प्रोग्रामिंग का उपयोग करना है, जैसे AspectJ।

class Person { 
    @Delegate Animal animal; 
    ... 
} 

तब आपको एक पहलू यह है कि पाता है @Delegate रों लिखने के लिए है और स्वचालित रूप से कहते हैं चाहते हैं:

एक पहलू संकलक (या क्रम) एनोटेशन का उपयोग और भाषा के लिए एक सरल विस्तार के साथ आ सकता है बीत रहा है कक्षाओं में अग्रेषण विधियां (उदाहरण के लिए Person) इंटरफ़ेस।

आप एक बार देख here हो सकता है,:

आप a more groovy JVM language उपयोग करने के लिए सक्षम हैं, तो, तो आप भी कोड की एक पंक्ति लिखने के लिए, क्योंकि इस तरह भाषाओं मानक पुस्तकालय में प्रतिनिधियों है नहीं होगा यह देखने के लिए कि यह ग्रोवी में कैसे किया जाता है। (Person उदाहरण वाक्यविन्यास की तरह अनिवार्य रूप से मैं आया था ... लेकिन अंतर्निहित!)

2

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

public interface DelegatedFunction<T> { 

T call(Object... args); 

} 

public class DoesSomeDelegatedTask { 

    private List<DelegatedFunction<String>> delegatedFunctions = new ArrayList<>(1); 

    public void addFunction(DelegatedFunction<String> function) { 
    delegatedFunctions.add(function); 
    } 

    public void execute() { 
    for (DelegatedFunction<String> function: delegatedFunctions) { 
     System.out.println(function(something, someotherthing, whatever)); 
    } 
    } 
} 

public class Main { 
    public static void main(String[] args) throws Exception { 
    DoesSomeDelegateTask doer = new DoesSomeDelegatedTask(); 
    doer.addFunction(new DelegatedFunction<String>() { 
     @Override 
     public String call(Object... args) { 
     return ((SomeThings) args[0]).whatever((SomeOtherThing) args[1]//you get the idea 
     } 
    } 
    doer.execute(); 
    } 
}