यहां बहुत सारे शानदार उत्तर हैं, लेकिन मुझे अक्सर बीओटीएच इंटरफेस का उपयोग करना पड़ता है और अमूर्त कक्षाएं सबसे अच्छा मार्ग है। इस आकस्मिक उदाहरण पर विचार करें:
आप एक निवेश बैंक में एक सॉफ्टवेयर डेवलपर हैं, और एक ऐसी व्यवस्था बनाने की जरूरत है, जो किसी बाजार में ऑर्डर दे। आपका इंटरफ़ेस एक ट्रेडिंग सिस्टम के सबसे सामान्य विचार को दर्शाता है ,
1) Trading system places orders
2) Trading system receives acknowledgements
और एक इंटरफ़ेस में कैद किया जा सकता है, ITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
अब बिक्री डेस्क पर और अन्य व्यावसायिक लाइनों के साथ काम करने वाले इंजीनियर अपने मौजूदा ऐप में ऑर्डर प्लेसमेंट कार्यक्षमता जोड़ने के लिए आपके सिस्टम के साथ इंटरफेस करना शुरू कर सकते हैं। और आपने अभी तक निर्माण शुरू नहीं किया है! यह इंटरफेस की शक्ति है।
तो आप आगे बढ़ते हैं और स्टॉक व्यापारियों के लिए सिस्टम का निर्माण करते हैं ; उन्होंने सुना है कि आपके सिस्टम में सस्ते स्टॉक खोजने की सुविधा है और वे इसे आज़माने के लिए बहुत उत्सुक हैं! आप इस व्यवहार को नामक विधि में कैप्चर करते हैं findGoodDeals()
, लेकिन यह भी महसूस करते हैं कि बाजारों से जुड़ने में बहुत सारी गड़बड़ चीजें हैं। उदाहरण के लिए, आपको एक खोलना होगा SocketChannel
,
public class StockTradeSystem implements ITradeSystem{
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
ठोस कार्यान्वयन के लिए इन गन्दे तरीकों के बहुत सारे विकल्प हैं connectToMarket()
, लेकिन findGoodDeals()
क्या सभी व्यापारी वास्तव में इसकी परवाह करते हैं।
अब यहाँ जहाँ अमूर्त कक्षाएं चलन में हैं। आपका बॉस आपको सूचित करता है कि मुद्रा व्यापारी भी आपके सिस्टम का उपयोग करना चाहते हैं। और मुद्रा बाजारों को देखते हुए, आप देखते हैं कि नलसाजी शेयर बाजारों के लगभग समान है। वास्तव में, connectToMarket()
विदेशी मुद्रा बाजारों से जुड़ने के लिए शब्दशः पुन: उपयोग किया जा सकता है। हालांकि, findGoodDeals()
मुद्रा क्षेत्र में एक बहुत अलग अवधारणा है। इससे पहले कि आप समुद्र के पार विदेशी मुद्रा विज्जू बच्चे को कोडबेस पास करें, आप पहले एक abstract
कक्षा में findGoodDeals()
रिफ्लेक्टर कर देते हैं , जो बेवजह छूट जाता है
public abstract class ABCTradeSystem implements ITradeSystem{
public abstract void findGoodDeals();
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
आपका स्टॉक ट्रेडिंग सिस्टम लागू findGoodDeals()
करता है जैसा कि आपने पहले ही परिभाषित किया है,
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
लेकिन अब एफएक्स व्हिज़ का बच्चा findGoodDeals()
मुद्राओं के लिए केवल एक कार्यान्वयन प्रदान करके अपनी प्रणाली का निर्माण कर सकता है ; उसे सॉकेट कनेक्शन या यहां तक कि इंटरफ़ेस विधियों को फिर से लागू करने की आवश्यकता नहीं है!
public class CurrencyTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
ccys = <Genius stuff to find undervalued currencies>
System.out.println("The best FX spot rates are: " + ccys);
}
एक इंटरफ़ेस के लिए प्रोग्रामिंग शक्तिशाली है, लेकिन इसी तरह के अनुप्रयोग अक्सर लगभग समान तरीकों से तरीकों को फिर से लागू करते हैं। एक अमूर्त वर्ग का उपयोग, इंटरफ़ेस की शक्ति को संरक्षित करते हुए, पुनर्मिलन से बचा जाता है।
नोट: कोई आश्चर्यचकित हो सकता है कि findGreatDeals()
इंटरफ़ेस का हिस्सा क्यों नहीं है। याद रखें, इंटरफ़ेस एक ट्रेडिंग सिस्टम के सबसे सामान्य घटकों को परिभाषित करता है। एक अन्य इंजीनियर एक पूर्ण व्यापार प्रणाली विकसित कर सकते हैं, जहाँ वे अच्छे सौदे खोजने के बारे में परवाह नहीं करते हैं। इंटरफ़ेस यह गारंटी देता है कि बिक्री डेस्क उनके सिस्टम को भी इंटरफ़ेस कर सकता है, इसलिए यह आपके इंटरफेस को एप्लिकेशन अवधारणाओं जैसे "इंटरएक्टिव डील" के साथ उलझाना बेहतर नहीं है।