सजावटी पैटर्न का उपयोग गतिशील रूप से वस्तुओं (यानी, रन टाइम पर) क्षमताओं को जोड़ने के लिए किया जाता है। आम तौर पर जब आप कक्षा लिखते हैं तो वस्तु की क्षमताओं को ठीक किया जाएगा। लेकिन एक महत्वपूर्ण बात यह है कि ऑब्जेक्ट की कार्यक्षमता इस तरह से विस्तारित होती है जो ऑब्जेक्ट के क्लाइंट के लिए पारदर्शी होती है क्योंकि यह उसी इंटरफ़ेस को लागू करती है क्योंकि मूल ऑब्जेक्ट सजाए गए ऑब्जेक्ट को जिम्मेदार बनाता है।
सजावटी पैटर्न परिदृश्यों में काम करता है जहां ऑब्जेक्ट की कई वैकल्पिक कार्यक्षमताएं होती हैं। सजावटी पैटर्न के बिना आपको प्रत्येक ऑब्जेक्ट-विकल्प कॉन्फ़िगरेशन के लिए एक अलग श्रेणी बनाना होगा। एक उदाहरण जो कि उपयोगी है हेड फर्स्ट डिज़ाइन पैटर्न O'Reilly द्वारा पुस्तक से आता है। यह कॉफी शॉप उदाहरण का उपयोग करता है जो स्टारबक्स की तरह लगता है।
तो आपके पास लागत जैसी विधि के साथ मूल कॉफी है।
public double cost(){
return 3.45;
}
तो ग्राहक इसलिए अब आप लागत विधि के साथ एक CoffeeCream वर्ग बनाने क्रीम जो 0.35 की लागत जोड़ सकते हैं:
public double cost(){
return 3.80;
}
तो ग्राहक मोचा जो 0.5 लागत चाहते हो सकता है, और वे मोचा चाहते हो सकता है क्रीम के बिना क्रीम या मोचा के साथ। तो आप क्लासमोचा क्रीम और कॉफीमोचा कक्षाएं बनाते हैं। फिर एक ग्राहक डबल क्रीम चाहता है ताकि आप एक क्लास कॉफीक्रीमक्रीम बना सकें ... आदि। आप कक्षा विस्फोट के साथ क्या खत्म कर रहे हैं। इस्तेमाल किए गए खराब उदाहरण से क्षमा करें। यह थोड़ा देर हो चुकी है और मुझे पता है कि यह मामूली है लेकिन यह बिंदु व्यक्त करता है।
इसके बजाय आप एक अमूर्त लागत विधि के साथ एक आइटम सार वर्ग बना सकते हैं:
public abstract class Item{
public abstract double cost();
}
और तुम एक ठोस कॉफी वर्ग फैली बना सकते हैं मद:
public class Coffee extends Item{
public double cost(){
return 3.45;
}
}
तो फिर तुम एक CoffeeDecorator बनाने कि एक ही इंटरफ़ेस का विस्तार करें और एक आइटम शामिल करें।
public abstract class CoffeeDecorator extends Item{
private Item item;
...
}
तो फिर तुम प्रत्येक विकल्प के लिए ठोस सज्जाकार बना सकते हैं:
public class Mocha extends CoffeeDecorator{
public double cost(){
return item.cost() + 0.5;
}
}
सूचना कैसे डेकोरेटर परवाह नहीं करता वस्तु की किस प्रकार यह बस के रूप में लंबे समय के रूप में यह किसी आइटम की लपेटकर है? यह आइटम ऑब्जेक्ट की लागत() का उपयोग करता है और बस अपनी लागत जोड़ता है।
public class Cream extends CoffeeDecorator{
public double cost(){
return item.cost() + 0.35;
}
}
अब यह इन कुछ वर्गों के साथ विन्यास की एक बड़ी संख्या के लिए संभव है: उदा
Item drink = new Cream(new Mocha(new Coffee))); //Mocha with cream
या
Item drink = new Cream(new Mocha(new Cream(new Coffee))));//Mocha with double cream
और इतने पर।
आह, मुझे लगता है कि आप हेड फर्स्ट डिजाइन पैटर्न के पाठक हैं? – dhiller
मुझे यह उत्तर विकिपीडिया लेख की तुलना में समझने में आसान लगता है। –
@ डिलर हाँ। डिजाइन पैटर्न पहली बार मैंने कोशिश की थी और अपने सभी छात्रों को उनकी सिफारिश करना शुरू कर दिया था। –