एक इंटरफ़ेस विधियों को परिभाषित करता है किसी ऑब्जेक्ट को प्रतिक्रिया देने के लिए प्रतिबद्ध किया जाता है।
आप इंटरफ़ेस लिए कोड है, तो आप अंतर्निहित वस्तु को बदल सकते हैं और अपने कोड अभी भी काम करेंगे (क्योंकि आपके कोड डब्ल्यूएचओ काम करते हैं या कैसे काम किया जाता है की नास्तिक है) आप लचीलापन इस लाभ मार्ग।
यदि आप किसी विशेष कार्यान्वयन लिए कोड जब यदि आप क्योंकि नई वस्तु एक ही तरीके का जवाब नहीं हो सकता है, अंतर्निहित अपने कोड होगा सबसे अधिक संभावना को तोड़ने आपत्ति बदलने की जरूरत है।
तो एक स्पष्ट उदाहरण डाल करने के लिए:
आप वस्तुओं आप एक Vector उपयोग करने का फैसला हो सकता है की एक संख्या पकड़ करने के लिए की जरूरत है।
आप लिखते हैं आप वेक्टर के पहले वस्तु का उपयोग करने की जरूरत है हो सकता है:
Vector items = new Vector();
// fill it
Object first = items.firstElement();
अब तक तो अच्छा।
बाद में आप का फैसला किया है कि क्योंकि के लिए "कुछ" कारण आप कार्यान्वयन को बदलने की जरूरत
आपको पता है कि आप एक ArrayList instad उपयोग करने की आवश्यकता (मान लीजिए कि वेक्टर अत्यधिक तुल्यकालन के कारण अड़चन पैदा करता है)।
ठीक है, आप कोड टूट जाएगा ...
ArrayList items = new ArrayList();
// fill it
Object first = items.firstElement(); // compile time error.
आप नहीं कर सकते। यह लाइन और उन सभी पंक्तियों का उपयोग जो प्रथम एलिमेंट() विधि का उपयोग करेंगे तो टूट जाएंगे।
यदि आपको विशिष्ट व्यवहार की आवश्यकता है और आपको निश्चित रूप से इस विधि की आवश्यकता है, तो यह ठीक हो सकता है (हालांकि आप कार्यान्वयन को बदलने में सक्षम नहीं होंगे) लेकिन यदि आपको केवल पहले तत्व को पुनर्प्राप्त करना है (जो है , वेक्टर के साथ कुछ खास नहीं है कि इसमें पहली एलीमेंट() विधि है) फिर कार्यान्वयन के बजाय इंटरफ़ेस का उपयोग करने से आपको बदलने की लचीलापन मिल जाएगी।
List items = new Vector();
// fill it
Object first = items.get(0); //
इस फार्म आप get method of Vector लिए कोडिंग में नहीं आते, लेकिन get method of List करने के लिए।
यह कैसे करना है अंतर्निहित वस्तु विधि करता है, जब तक कि यह
इस तरह "संग्रह का 0 तत्व मिल" के अनुबंध का जवाब के रूप में आप बाद में किसी अन्य कार्यान्वयन के लिए इसे बदल सकता है कोई फर्क नहीं पड़ता :
List items = new ArrayList(); // Or LinkedList or any other who implements List
// fill it
Object first = items.get(0); // Doesn't break
यह नमूना अनुभवहीन लग सकता है, लेकिन आधार
(यहां तक कि उन भाषा है जो स्थिर अजगर, रूबी, स्मालटाक, ऑब्जेक्टिव-सी आदि की तरह टाइप नहीं कर रहे हैं पर), जिस पर OO प्रौद्योगिकी आधारित है एक और जटिल उदाहरण टी है वह रास्ता JDBC काम करता है। आप ड्राइवर बदल सकते हैं, लेकिन आपकी अधिकांश कॉल उसी तरह काम करेगी। उदाहरण के लिए आप ऑरैकल डेटाबेस के लिए मानक ड्राइवर का उपयोग कर सकते हैं या आप वेबलॉगिक या वेबस्फेयर प्रदान करने वाले एक और परिष्कृत उपयोग कर सकते हैं। बेशक यह जादुई आप अभी भी करने से पहले अपने उत्पाद का परीक्षण करने की जरूरत नहीं है, लेकिन कम से कम आप की तरह सामान की जरूरत नहीं है:
statement.executeOracle9iSomething();
बनाम
statement.executeOracle11gSomething();
कुछ इसी तरह के जावा स्विंग के साथ होता है।
अतिरिक्त पठन:
Design Principles from Design Patterns
Effective Java Item: Refer to objects by their interfaces
(इस पुस्तक सबसे अच्छी चीजों में आप जीवन में कर सकता है में से एक खरीद - और निश्चित रूप से अगर पढ़ा -)
वाह! यह बहुत अच्छी तरह से समझाया गया है! –
धन्यवाद! खुशी है कि मैं मदद कर सकता हूं :) – weiji
बस ध्यान रखें कि यह सिद्धांत आपके द्वारा बनाए गए प्रकारों के साथ-साथ सेट जैसी अंतर्निहित अवशेषों के लिए भी जाता है। उदाहरण के लिए, यदि आपके पास अपनी परियोजना में "फू" है। इसके बजाय "क्लास फू" न बनाएं, इसके बजाय "इंटरफ़ेस फू" बनाएं और उसके बाद "क्लास माईफू फू लागू करता है" जैसे कुछ कार्यान्वयन हो सकते हैं। आपको यह भी पता चलेगा कि आपके प्रोजेक्ट में "फू" इंटरफ़ेस को लागू करने वाले कई वर्ग होंगे। कार्यान्वयन के बजाय इंटरफ़ेस का नाम लगातार लिखकर (कन्स्ट्रक्टर इनवोकेशन को छोड़कर) आप अपनी आवश्यकताओं के अनुरूप फू कार्यान्वयन को जल्दी से बदल सकते हैं। –