चार परिभाषाओं की गिरोह पढ़ने के बाद, मुझे विश्वास नहीं है कि एक वास्तविक अंतर है। (सुविधा के लिए शामिल)
- डेकोरेटर: आदेश में अपने मौजूदा जिम्मेदारियों को संशोधित करने के वस्तुओं के गतिशील रैपिंग के लिए अनुमति देता है और व्यवहार
- जिम्मेदारी की चेन: एक से अधिक वस्तु प्राप्त जोड़ने के द्वारा एक अनुरोध को पूरा करने का अवसर देता है एक साथ वस्तुओं
विकिपीडिया उन्हें थोड़ा बाहर निकाल देता है, लेकिन इसमें से कुछ तरह मनमाना है।
- सजावटी आमतौर पर एक लिंक्ड सूची के रूप में लागू किया जाता है। लेकिन मुझे लगता है कि पैटर्न के "भाग" के रूप में माना जाने वाला बहुत कम स्तर है।
- उत्तरदायित्व लिंक की श्रृंखला केवल तभी डेटा संभालती है जब यह उनकी ज़िम्मेदारी है; लेकिन जिम्मेदारी निर्धारित करना और डेटा हैंडलिंग व्यवहार का दोनों हिस्सा हैं। सजावटी इसे आसानी से कर सकते हैं।
- सजावटी के लिए आपको प्रतिनिधि को कॉल करने की आवश्यकता है।
- एक "शुद्ध" सीओआर लिंक केवल प्रतिनिधि को कॉल करना चाहिए यदि यह डेटा को संभाल नहीं लेता है।
पहले दो गुण वास्तव में पैटर्न को अलग नहीं करते हैं। दूसरा दो करते हैं, लेकिन जिस तरह से सजावटी और सीओआर लागू होते हैं, वे उन गुणों को लागू नहीं करते हैं - डिजाइनर को उम्मीद है कि कोई भी एक सजावट लिखता है जो श्रृंखला को तोड़ता है या एक कोर्लिंक जो आंकड़ों को संभालने के बाद चेन जारी रखता है।
वास्तव में इन विशेषताओं को लागू करने के लिए, आपको निम्न की तरह कुछ चाहिए।
से लागू डेकोरेटर:
abstract class Decorated {
public Decorated delegate;
public final Object doIt(Object args) {
Object returnVal = behavior(arg);
if(delegate != null) returnVal = delegate.doit(returnVal);
return returnVal;
}
protected abstract Object behavior(Object args); //base or subclass behavior
}
उत्तरदायित्व का बलपूर्वक चेन:
abstract class Link {
public Link delegate;
public final Object processIt(Obect args) {
Object returnVal = args;
if(isMyResponsibility) returnVal = processingBehavior(returnVal);
else returnVal = delegate.processIt(returnVal);
return returnVal;
}
protected abstract Boolean isMyResponsibility(Object args);
protected abstract Object processingBehavior(Object args);
}
(वैकल्पिक रूप से, तुम सिर्फ एक लाइन जावाडोक लिए, अगर सब आप चाहते हैं responsibiity की अपने आप को दोषमुक्त करने के लिए है जोड़ सकता है अगर कोई और आपके डिजाइन को खराब कर देता है - लेकिन इसे मौका क्यों छोड़ दें?)
स्रोत
2014-03-18 19:09:24
कृपया एक ऐसा कार्य जोड़ें जो आपको लगता है कि CoR के लिए कार्य है लेकिन आपने इसे सजावटी –
के साथ हल किया है, निश्चित रूप से, मुझे ऑर्डर पूरा करने की आवश्यकता है और कुछ मामलों में मुझे बिल प्रिंट करना होगा। मेरा सजावटी समाधान एक ऑर्डर कॉम्प्लेशनप्रिंटडेकोरेटर में लिपटे कोर ऑर्डर कॉम्प्लेटर है जो सशर्त तर्क और प्रिंट लागू करता है। बस किसी भी श्रृंखला के साथ काम करता है। –
आपके पास ऑर्डरकंपलटर के अंदर "प्रिंट" नामक विधि क्यों नहीं हो सकती है जिसे आप प्रिंट करना चाहते हैं (या नहीं) का उपयोग किया जा सकता है (या नहीं)? दूसरे शब्दों में, मैं सोच रहा था कि क्या आप इस कार्य को किसी भी पैटर्न का उपयोग करके हल कर सकते हैं? यह मुझे जटिल कार्य की तरह प्रतीत नहीं होता है जिसमें अमूर्तता और जटिलता को शुरू करने की वास्तविक आवश्यकता है। या शायद आपने जो कहा वह समस्या का एक अतिव्यापी संस्करण है। –