2008-11-07 16 views
13

प्रस्तुत करना मेरे पास A नामक एक वर्ग है, और मैं सजावटी डिजाइन पैटर्न का उपयोग करना चाहता हूं। अगर मैं गलत हूं, तो मुझे सही करें, लेकिन इसके लिए काम करने के लिए, हमें एक सजावटी वर्ग बनाने की आवश्यकता होगी, ADecorator कहें, जिसमें A इंस्टेंस का संदर्भ होगा, और अन्य सभी सजावटी कार्यक्षमता जोड़ने के लिए इसका विस्तार करेंगे।हमें सजावटी डिजाइन पैटर्न में सजावट की आवश्यकता क्यों है?

मुझे समझ में नहीं आता कि हमें A उदाहरण का उपयोग करने के बजाय सजावट वर्ग क्यों बनाना है?

उत्तर

25

सजावटी पैटर्न का उपयोग गतिशील रूप से वस्तुओं (यानी, रन टाइम पर) क्षमताओं को जोड़ने के लिए किया जाता है। आम तौर पर जब आप कक्षा लिखते हैं तो वस्तु की क्षमताओं को ठीक किया जाएगा। लेकिन एक महत्वपूर्ण बात यह है कि ऑब्जेक्ट की कार्यक्षमता इस तरह से विस्तारित होती है जो ऑब्जेक्ट के क्लाइंट के लिए पारदर्शी होती है क्योंकि यह उसी इंटरफ़ेस को लागू करती है क्योंकि मूल ऑब्जेक्ट सजाए गए ऑब्जेक्ट को जिम्मेदार बनाता है।

सजावटी पैटर्न परिदृश्यों में काम करता है जहां ऑब्जेक्ट की कई वैकल्पिक कार्यक्षमताएं होती हैं। सजावटी पैटर्न के बिना आपको प्रत्येक ऑब्जेक्ट-विकल्प कॉन्फ़िगरेशन के लिए एक अलग श्रेणी बनाना होगा। एक उदाहरण जो कि उपयोगी है हेड फर्स्ट डिज़ाइन पैटर्न 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 

और इतने पर।

+0

आह, मुझे लगता है कि आप हेड फर्स्ट डिजाइन पैटर्न के पाठक हैं? – dhiller

+0

मुझे यह उत्तर विकिपीडिया लेख की तुलना में समझने में आसान लगता है। –

+0

@ डिलर हाँ। डिजाइन पैटर्न पहली बार मैंने कोशिश की थी और अपने सभी छात्रों को उनकी सिफारिश करना शुरू कर दिया था। –

5

मैं wikipedia आलेख को बेहतर समझा नहीं सकता।

+0

यह लगभग एक झटकेदार जवाब की तरह लगता है, लेकिन फिर मैं गया और विकिपीडिया लेख और हाँ पर देखा, यह उत्कृष्ट है। चरडे, जो कुछ भी आप जानना चाहते थे वह ठीक है, जिसमें कौन, क्या, कब, कहाँ और कैसे! –

+0

क्षमा करें अगर यह snarky लग रहा है, लेकिन अंग्रेजी मेरी मूल भाषा नहीं है, तो इस तरह के "दुर्घटनाओं" होने के बावजूद है :-) – Kasper

2

कुछ भाषाओं में (रूबी या जावास्क्रिप्ट की तरह) आप केवल एक उदाहरण में नई कार्यक्षमता जोड़ सकते हैं। मैंने देखा है कि आपका प्रश्न जावा टैग किया गया है, इसलिए मुझे लगता है कि आप पूछ रहे हैं कि आप जावा में ऐसा क्यों नहीं कर सकते हैं। कारण यह है कि जावा स्थिर रूप से टाइप किया गया है। एक उदाहरण में केवल उन तरीकों का हो सकता है जो कक्षा ए परिभाषित करता है या विरासत में आता है। इसलिए, यदि आप ए उदाहरण को एक विधि देने के लिए रन टाइम पर चाहते हैं कि ए परिभाषित नहीं करता है, तो इस नई विधि को एक अलग वर्ग में परिभाषित किया जाना चाहिए।

3

बीटीडब्ल्यू, यदि आप पैटर्न पर शुरू कर रहे हैं, तो हेड फर्स्ट डिज़ाइन पैटर्न बुक अभूतपूर्व है। यह वास्तव में अवधारणाओं को पचाने के लिए सरल बनाता है, और इस तरह के पैटर्न को विपरीत तरीके से तुलना करने और तुलना करने के लिए सुनिश्चित करता है जो हास्यास्पद रूप से समझने में आसान है।

+0

मुझे इसे दूसरा करना है, पुस्तक अविश्वसनीय है। वास्तव में उपरोक्त कॉफी उदाहरण उस पुस्तक से लिया जाता है लेकिन पुस्तक उस उदाहरण को बहुत आगे ले जाती है। –

संबंधित मुद्दे