इन कक्षाओं पर विचार करें:
Class DbLog implements Logger
{
public function log($msg) { /* log $msg to database */ }
}
Class FileLog implements Logger
{
public function log($msg) { /* log $msg to file */ }
}
दोनों वर्गों Logger
को लागू करने और उनके लिए एक विधि log($msg)
करना होगा। आप मूल रूप से कह रहे हैं: "हे क्लास, यदि आप लॉगर बनना चाहते हैं, तो सुनिश्चित करें कि मैं आप पर लॉग() कॉल कर सकता हूं।"। अब आप अपने कोड में कहीं आप अगर यह FileLog
, DbLog
या किसी अन्य ठोस लॉगर हो जाता है परवाह नहीं है की तरह
class Foo
{
protected $logger;
public function __construct(Logger $logger)
{
$this->logger = $logger;
$this->logger->log('I can haz logger! Yay!');
}
}
Foo
एक वर्ग है कि एक लकड़हारा की जरूरत है, हो सकता है। यह सिर्फ परवाह करता है कि इसे कोई लॉगर यह log()
पर कॉल कर सकता है। फू को log()
में रुचि नहीं है। सभी Foo
परवाह है log()
पर कॉल करने में सक्षम है। हालांकि आप इंटरफ़ेस में log()
पर कॉल नहीं कर रहे हैं। आप इसे कंक्रीट क्लास में बुला रहे हैं जो Foo
पर पास किया गया था, लेकिन एक यूएमएल आरेख में आप इसका प्रतिनिधित्व करेंगे जैसा कि आपने लिंक किए गए पेज में दिखाया है, क्योंकि आप इंटरफ़ेस के विरुद्ध कोड किए गए हैं।
इसका मुख्य लाभ यह है कि आपकी कक्षाएं बहुत कम हैं। आप निर्भरता को अधिक आसानी से स्वैप कर सकते हैं, उदाहरण के लिए यूनिट-परीक्षण में मोक्स का उपयोग करते समय, और आपका कोड अधिक रखरखाव योग्य होगा।
असल में, एक वैचारिक मानकीकरण के रूप में एक इंटरफ़ेस के बारे में सोचें। उदाहरण के लिए, जब आप एक नया डीवीडी प्लेयर खरीदते हैं, तो आप उम्मीद करते हैं कि यह ► बटन है कि किसी भी तरह (आपको परवाह नहीं है कि, बस इतना) खिलाड़ी को डीवीडी चलाता है।जब आप उस बटन को दबाते हैं, तो आप सामान्य सार डीवीडी इंटरफ़ेस विनिर्देश को दबा नहीं रहे हैं जो कहता है कि एक डीवीडी प्लेयर के पास एक प्ले बटन होना चाहिए, लेकिन आपने इस ब्रांड के प्लेयर पर प्ले बटन के ठोस कार्यान्वयन पर क्लिक किया है।
इंटरफ़ेस का कुछ विचार यहां प्राप्त करें http://stackoverflow.com/q/8531292/1055241 – gprathour