2010-04-06 15 views
23

सजावटी पैटर्न कक्षाओं के गतिशील विस्तार-पर-रनटाइम है। यह गतिशील रूप से एक रिश्ता बनाता है।मिक्सीन और सजावटी पैटर्न के बीच क्या अंतर है?

मुझे आश्चर्य हुआ कि क्या मैं मिक्सर और एक अमूर्त वर्ग के बीच अंतर के बारे में this answer प्राप्त करने के बाद सजावटी पैटर्न का उपयोग कर अपने एपीआई को अधिक जटिल बना रहा था।

उत्तर

9

जब आप अपनी कक्षा में कुछ व्यवहार जोड़ रहे हैं तो एक मिश्रण उपयुक्त है। जैसे संग्रह प्रकार के मामले में गणना करने की क्षमता। आप चाहें अपनी कक्षा में व्यवहार के कई सेट मिश्रण कर सकते हैं। सामान्य कोड का पुन: उपयोग करने का यह एक अच्छा तरीका है; आप मूल रूप से मुफ्त में विधियों का एक गुच्छा मिलता है।

दूसरी तरफ एक सजावटी एक स्नीकी इंटरसेप्टर है। यह लक्ष्य ऑब्जेक्ट के समान सार्वजनिक इंटरफ़ेस का खुलासा करता है, जिसमें एक लक्षित ऑब्जेक्ट होता है जिसमें यह सभी क्लाइंट कॉल का प्रतिनिधित्व करता है; हालांकि यह कुछ पूर्व और/या पोस्ट प्रोसेसिंग के साथ कॉल को सजाता है। जैसे अगर मैं एक MyCollection के खिलाफ कोड लिख रहा हूं और मैं इस प्रकार के सभी कॉल लॉग इन करना चाहता हूं। मैं एक नया सजावट MyCollectionWithTimeStampedLogging प्राप्त कर सकता हूं जो दोनों एक आईसीओलेक्शन बेस से प्राप्त होता है ताकि वे ग्राहक के समान दिख सकें। सजावटी आईसीओलेक्शन का एक सीटीओआर param और प्रतिनिधि कॉल के रूप में एक उदाहरण लेगा। जैसे जोड़ें

public void Add(int item) 
{ 
    _logger.log(String.Format("{0} Add called with param {1}", DateTime.Now, item.ToString()); 
    _collection.Add(item); 
    _logger.log(String.Format("{0} Add completed with param {1}", DateTime.Now, item.ToString()); 
} 
+0

तो एक सजावटी एस्पेक्ट ओरिएंटेड प्रोग्रामिंग (एओपी) के करीब है, और एक मिश्रण सिर्फ आपके मौजूदा वर्गों को संशोधित करता है? – leeand00

+0

@ leeand00 - तरह का; एओपी सिर्फ मुझे लगता है कि सजावट करने वालों की तुलना में बहुत अधिक है। मिक्सिन गतिशील भाषाओं में अधिक प्रचलित हैं, एक मिश्रण के साथ, आप अपनी कक्षा परिभाषा में तरीकों का एक गुच्छा 'मिश्रण' करते हैं। जैसे आप एक मॉड्यूल पर्सिस्टेबल में लोड और सेव कार्यान्वयन (जो क्लास को प्रतिबिंबित करते हैं और डिस्क पर सार्वजनिक गुण पढ़ते हैं) लिख सकते हैं, फिर इसे कई कक्षाओं में मिलाएं। इन सभी कक्षाओं को अब डिस्क पर रखा जा सकता है। – Gishu

+0

एओपी के साथ (जो मैं इससे अधिक परिचित हूं ... मिश्रण कहते हैं) आप चयनित इंटरफेस के साथ 3 अलग-अलग चीजें निर्दिष्ट कर सकते हैं, आप प्री-एक्शन, पोस्ट-एक्शन और इसके बदले में निर्दिष्ट कर सकते हैं कार्रवाई। – leeand00

2

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

+2

ऐसा नहीं होना चाहिए, लेकिन यह हो सकता है। – leeand00

12

सजावटी पैटर्न का उपयोग करते समय, आप आम तौर पर बेस क्लास को विस्तारित (या मिश्रण) करने के बजाय encapsulating कर रहे हैं। अक्सर आप ऐसा इसलिए करते हैं क्योंकि आप कक्षा की कार्यक्षमता का उपयोग करना चाहते हैं लेकिन आप कॉल को लपेटना चाहते हैं ताकि आप कॉल से पहले या बाद में कुछ अतिरिक्त कदम उठा सकें। एक LoggerDecorator

public class LoggerDecorator implements SomeInterface { 
     private SomeInterface delegate; 
     public void someMethod() { 
      LOGGER.debug("someMethod called"); 
      delegate.someMethod(); 
     } 
} 

आप वास्तव में प्रतिनिधि बेनकाब करने के लिए नहीं करना चाहते हैं पर विचार करें, लेकिन आप अपनी कार्यक्षमता का उपयोग करना चाहते। तो चाहे आप हमें मिश्रण करते हैं या नहीं, एक वर्ग बढ़ाते हैं, या सजाने वास्तव में उस पर निर्भर करता है जो आप करने की कोशिश कर रहे हैं। क्या आप कक्षा में विस्तार कर रहे हैं और इसमें नई कार्यक्षमता जोड़ रहे हैं? या आप कक्षा को लपेट रहे/सजा रहे हैं?

+0

@ जेफ कृपया देखें कि मैंने नीचे गिशू की पोस्ट में क्या टिप्पणी की है और मुझे बताएं कि मुझे यह मिला है या नहीं। – leeand00

+0

मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन एओपी एक गतिशील इंटरसेप्टर फ्रेमवर्क है, जो रनटाइम पर होता है (या संकलन समय यदि आप पहलू के साथ संकलित करते हैं)। आम तौर पर मैं सजावटी मार्ग पर जाने की अनुशंसा करता हूं जब तक आपको एओपी की आवश्यकता न हो क्योंकि यदि आप सावधान नहीं हैं तो रनटाइम इंजेक्शन बहुत अधिक भंगुर हो सकता है। –

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