2010-08-13 28 views
31

सजावट पैटर्न का उपयोग करना आवश्यक है? यदि संभव हो, तो मुझे एक असली दुनिया का उदाहरण दें जो पैटर्न के लिए उपयुक्त है।हमें सजावटी पैटर्न की आवश्यकता कब होती है?

+1

उपलब्ध है अगर आपको यह जानना है कि सजावट पैटर्न उपयोगी होगा या नहीं, तो आपको हमें यह बताने की ज़रूरत है कि अगर आप एक सामान्य उदाहरण चाहते हैं तो विकिपीडिया पर सजावटी पैटर्न देखें। –

+0

[सजावटी डिजाइन पैटर्न] (http://www.singhajit.com/decorator-design-pattern/) - बताता है कि हमें वास्तविक जीवन उदाहरण के साथ डिज़ाइन पैटर्न की आवश्यकता है –

उत्तर

50

जावा में स्ट्रीम - InputStream और OutputStream के उप-वर्ग सजावट पैटर्न के सही उदाहरण हैं।

उदाहरण के लिए, डिस्क पर एक फ़ाइल लेखन:

File toWriteTo = new File("C:\\temp\\tempFile.txt"); 
OutputStream outputStream = new FileOutputStream(toWriteTo);  

outputStream.write("Sample text".getBytes()); 

तो फिर तुम डिस्क के लिए लेखन के बारे में कुछ अतिरिक्त कार्यक्षमता की आवश्यकता होती है चाहिए:

File toWriteTo = new File("C:\\temp\\tempFile.txt"); 
OutputStream outputStream = 
      new GZIPOutputStream(new FileOutputStream(toWriteTo)); 

outputStream.write("Sample text".getBytes()); 

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


सजावट पैटर्न का उपयोग किया जा सकता है, जहां बहुत से "असली दुनिया" उदाहरण हैं। मेरे सिर, कुछ उदाहरण के ऊपर से:

  • पढ़ना और डिस्क (ऊपर) के लिए लिख
  • ऐसे पाठ क्षेत्रों आदि के लिए पर स्क्रॉलबार के रूप में जोड़ने UI तत्व, का निर्माण

हेड फर्स्ट डिजाइन पैटर्न में कुछ और "असली दुनिया" उदाहरण हैं।ऐसा लगता है कि O'Reilly का नमूना अध्याय है, जो सजावटी पैटर्न पर है, मुफ्त में; PDF

+3

हां, java.io सजावट के बारे में पूरी तरह से है। – duffymo

+1

+1: प्यारा उदाहरण :) – Juliet

+1

+1 हालांकि मैं java.io में सजावट पैटर्न के भारी उपयोग को 'सुंदर' के रूप में नहीं मानता। यह एक कारण है कि जावा में आईओ फ़ाइल को ** में इतना दर्द है। – helpermethod

5

फाउलर विवरण पर एक नज़र डालें; यह किताबों/वीडियो और एक सजावटी "उधार लेने योग्य" से संबंधित एक ठोस उदाहरण देता है, आप इसे here पा सकते हैं।

8

गिरोह से चार की:

एक ग्राफिकल यूजर इंटरफेस टूलकिट, उदाहरण के लिए, यदि आप किसी भी यूजर इंटरफेस घटक को स्क्रॉल की तरह सीमाओं या व्यवहार की तरह गुण जोड़ने चाहिए।

...

डेकोरेटर घटक यह सजाया गया ताकि अपनी उपस्थिति घटक के ग्राहकों के लिए पारदर्शी है के इंटरफेस के अनुरूप है। सजावटी आगे घटक से अनुरोध करता है और आगे बढ़ने से पहले या बाद में अतिरिक्त क्रियाएं (जैसे सीमा खींचना) कर सकता है। पारदर्शिता आपको सजावटी को घोंसले से घोंसला देती है, जिससे असीमित संख्या में अतिरिक्त जिम्मेदारियां मिलती हैं।

+0

असली दुनिया के यूआई का इस तरह के सजावट का उपयोग करें? –

1

यदि आप जावा में स्विंग विकास (अन्य जीयूआई टूलकिट के साथ) से परिचित हैं, तो आप सजावटी पैटर्न को बहुत उपयोग करेंगे। आपके पास एक कन्स्ट्रक्टर हो सकता है जो एक विशिष्ट घटक लेता है और उसके बाद कार्यक्षमता जोड़ता है।

यहां a good article that uses Swing as an example है।

3

डेकोरेटर पैटर्न के इरादे के लिए है::

गतिशील एक वस्तु को अतिरिक्त जिम्मेदारी संलग्न गूगल इस लिंक दिखाया। सजावटी कार्यक्षमता विस्तार के लिए उपclassing के लिए एक लचीला विकल्प प्रदान करते हैं। [के माध्यम से हेड फर्स्ट: डिजाइन पैटर्न]

डेकोरेटर पैटर्न के सबसे भारी इस्तेमाल GUIs और java.io वर्ग हैं। डिजाइन पैटर्न डेकोरेटर पैटर्न [link] के बारे में जो कुछ अन्य उदाहरण प्रदान करते हैं:: वहाँ की हेड फर्स्ट एक नि: शुल्क अध्याय है

हम विरासत के प्रतीक अति प्रयोग फिर से जांच की जाती है और आप यह जानेंगे कि को सजाने के लिए ऑब्जेक्ट संरचना का एक रूप का उपयोग कर रनटाइम पर आपकी कक्षाएं। क्यूं कर? एक बार जब आप सजाने की तकनीक पता है, तुम अंतर्निहित वर्गों के लिए किसी भी कोड परिवर्तन किए बिना अपने (या किसी और के) वस्तुओं नई जिम्मेदारियों देने के लिए सक्षम हो जाएगा।

तुम भी उदाहरण[PDF] जिसमें डेकोरेटर पैटर्न एक मूल्यांकन आवेदन में प्रयोग किया जाता है द्वारा डेकोरेटर पैटर्न पढ़ सकते हैं।

Git: GitHub से डाउनलोड (या ब्राउज़) DonsProxy:

+0

हेड फर्स्ट पीडीएफ लिंक 404 है। –

+0

@ जेम्स.गर्रिस: निश्चित –

1

आप एक वास्तविक दुनिया उदाहरण के लिए कहा, तो ये रहा मूल रूप से //github.com/DonBranson/DonsProxy.git

DonsProxy HTTP ट्रैफिक को देखने या निकालने के लिए वायरटैप पैटर्न का उपयोग करता है, साथ ही यह आपको उप-विशिष्ट कनेक्शन अनुकरण करने के लिए कनेक्शन व्यवहार को संशोधित करने देता है। मैं उपयोगकर्ता विकल्पों के आधार पर चैनलों को संशोधित करने के लिए सजावटी पैटर्न का उपयोग करता हूं। कमांड लाइन या जीयूआई विकल्प (dependinvg जिस पर वे उपयोग कर रहे हैं) अन्य चीजों के साथ विलंबता इंजेक्शन और बैंडविड्थ इंजेक्शन की अनुमति देता है। जब वे विलंबता इंजेक्ट करते हैं, जो लेटेंसी डिकोरेटर को चैनल में जोड़ता है; अगर वे बैंडविड्थ को थ्रॉटल करते हैं, जो थ्रॉटलडेकोरेटर को चैनल में जोड़ता है। चूंकि यह एक सजावटी पैटर्न का उपयोग करता है, इसलिए वे अपने दिल की सामग्री में मिश्रण और मिलान कर सकते हैं।

3

मैंने देखा है कि सबसे अच्छे - और सबसे शाब्दिक - उपयोगों में से एक पूर्व-क्षमता को लागू करना था, एकल स्तर के पूर्ववत के पुराने पुराने दिनों में। वेक्टर ड्राइंग प्रोग्राम को देखते हुए, अलग-अलग रंगों के चयनित कई ऑब्जेक्ट्स के साथ: अपने सभी रंगों को बदलने के लिए कमांड को कार्यान्वित करें। और इसे पूर्ववत करें। यह एक सजावट लगाने के द्वारा किया गया था, जिसे getColor() धारा में बुलाया गया था, ताकि जब उन्हें खींचा गया, तो वे नए रंग में खींचे गए; अनिवार्य रूप से ऑब्जेक्ट्स के अपने getcolor() विधियों को खारिज कर दिया गया था। तो वे नए रंग में दिखाई दिया। पूर्ववत करने के लिए सभी वस्तुओं से सजावटी को हटाने के रूप में सरल था; कार्रवाई करना सजावट से वस्तुओं को वस्तुओं को लागू करने और फिर इसे हटाने का विषय था। किस वस्तु को रंग दिया गया था और उनके मूल रंग क्या थे, इसकी एक तालिका रखने से कहीं अधिक सरल।

20

दो वास्तविक जीवन के उदाहरण:

डियाब्लो 2 और अंतिम काल्पनिक 7. हथियार में

आइटम उन्नयन प्रणाली और कवच सॉकेट या स्लॉट है। खेल के दौरान, खिलाड़ी उन स्लॉट में उन्नयन (रत्न, दौड़ या मटेरिया) डाल दिया।प्रत्येक अपग्रेड में एक व्यक्तिगत प्रभाव होता है (कहें, 8 अंक अग्नि क्षति या 10% मन लीक)। तो जब आप अपनी तलवार स्विंग करते हैं, तो यह इसके मूल नुकसान और आपके द्वारा जोड़े गए प्रत्येक अपग्रेड द्वारा जोड़ा गया नुकसान करता है। यह सजावटी पैटर्न से बहुत करीब से मेल खाता है।

+0

क्या यह सजावटी पैटर्न के साथ लागू किया गया है? ऐसा लगता है कि रणनीतियों की एक सूची भी काम करेगी। –

0

सजावट पैटर्न का उपयोग करना आवश्यक कब है?

जिम्मेदारियों

उपयोग Decorator_pattern अगर

  1. वस्तु जिम्मेदारियों और व्यवहार गतिशील रूप से जोड़ा जाना चाहिए/हटाया
  2. कंक्रीट कार्यान्वयन जिम्मेदारियों से decoupled किया जाना चाहिए और व्यवहार
  3. उपवर्गीकरण भी गतिशील रूप से जोड़ने के लिए महंगा है/निकालें

यदि संभव हो, तो मुझे एक असली दुनिया का उदाहरण दें जो पैटर्न के लिए उपयुक्त है।

मैं अपनी खुद की वेंडिंग मशीन सजावट के साथ आया हूं।

समस्या बयान: कंप्यूट चीनी, नींबू आदि की तरह एक या अधिक जायके जोड़कर पेय (चाय या कॉफी) की कीमत

कोड उदाहरण और स्पष्टीकरण @

When to Use the Decorator Pattern?

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

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