मेरे पास एक इंटरफ़ेस है जिसमें एक निश्चित मात्रा में अच्छी तरह से परिभाषित कार्यक्षमता है। हम कहते हैं:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
यह इंटरफ़ेस के अधिकांश कार्यान्वयन के लिए अच्छी तरह से काम करता है, लेकिन कुछ उदाहरणों में, मुझे कुछ नई कार्यक्षमता जोड़ने की आवश्यकता है (जैसे शायद एक नई पद्धति में लुढ़का हुआ है createBrownies()
)। ऐसा करने के लिए स्पष्ट / भोली दृष्टिकोण इंटरफ़ेस का विस्तार करना होगा:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
लेकिन इसमें एक बहुत बड़ा नकारात्मक पहलू यह है कि मैं मौजूदा API को संशोधित किए बिना नई कार्यक्षमता को नहीं जोड़ सकता (जैसे कि नए इंटरफ़ेस का उपयोग करने के लिए कक्षा को बदलना)।
मैं तात्कालिकता के बाद कार्यक्षमता जोड़ने के लिए एक एडेप्टर का उपयोग करने के बारे में सोच रहा था :
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
जो मुझे कुछ इस तरह शुद्ध करेगा:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
यह समस्या का एक अच्छा समाधान लगता है, लेकिन मैं सोच रहा हूं कि क्या मैं पुराने देवताओं को जागृत कर रहा हूं। क्या एडॉप्टर जाने का रास्ता है? वहाँ एक बेहतर पैटर्न का पालन करने के लिए है? या क्या मुझे वास्तव में सिर्फ बुलेट को काट देना चाहिए और सिर्फ मूल इंटरफ़ेस का विस्तार करना चाहिए?