2009-06-12 11 views
40

मैंने Context design pattern के बारे में पढ़ना शुरू कर दिया है। यहाँ है कि मैं क्या पाठ से समझ में आ रहा है:क्या आप संदर्भ डिजाइन पैटर्न समझा सकते हैं?

  • आप अपने सभी चर

  • आप, चारों ओर जिसे उसकी ज़रूरत के लिए इसे पारित ताकि आप के रूप में सभी चर भेजने के लिए की ज़रूरत नहीं होगी युक्त एक नक्शा है विधि पैरामीटर

क्या मैंने इसे "प्राप्त" किया?

+0

यह भी देखें: [संदर्भ ऑब्जेक्ट डिज़ाइन पैटर्न क्या है?] (Http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove

+0

मुझे लगता है कि @ glen-best answer चाहिए सही हो (63 बनाम 7 वोट)। –

उत्तर

18

एक संदर्भ वस्तु साझा डेटा और कार्यों के लिए पहुँच प्रदान करता है।

यह के लिए एक सुंदर और लचीला विकल्प हो सकता है:

  • वैश्विक
  • एकमात्र
  • लंबे पैरामीटर सूचियों

The ACCU provides a more detailed description.

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

आप जब संदर्भ पैटर्न का उपयोग कर अपने dependency graph के प्रति जागरूक होने की जरूरत है। (यही कारण है KaptajnKold यह कॉल एक विरोधी पैटर्न है।)

अनावश्यक निर्भरता को सीमित करने के लिए, विभिन्न प्रयोजनों के लिए विभिन्न संदर्भों का उपयोग करें। अपने संदर्भों को यथासंभव सरल रखें और आवश्यकता होने पर जटिलता जोड़ने के लिए संरचना या विरासत का उपयोग करें।

64

मैं इसे "मिल" किया?

कहने के लिए खेद है, बिल्कुल नहीं।

कंटेक्स्ट ऑब्जेक्ट का लक्ष्य नहीं है, जो कि मजबूत टाइपिंग और encapsulation द्वारा गुजरने के साधनों के रूप में, कई तरीकों से पैरामीटर को पारित करने के लिए है। लक्ष्य प्रोटोकॉल और प्रस्तुति प्रौद्योगिकी से स्वतंत्र, सामान्य, लेकिन प्रबंधित तरीके से स्कॉप्ड डेटा को स्टोर करना है। एक दायरे में संग्रहीत डेटा प्रकृति द्वारा साझा किया जाता है, अभी भी संरचित किया जा सकता है, और एक विधि में पारित एक-ऑफ पैरामीटर से मूल रूप से अलग है।

संदर्भ वस्तु पैटर्न पहले Core J2EE Patterns 2nd Ed में पेश किया गया था। 'संदर्भ' भाग तथ्य यह है कि वस्तु एक गुंजाइश
(application/session/request/conversation/flash जैसे) के संदर्भ में डेटा को होल्ड को दर्शाता है।

यह उद्देश्य है दसगुणा, इस तरह के HttpSession और HttpRequest के रूप में प्रोटोकॉल/प्रस्तुति-प्रौद्योगिकी विशिष्ट वर्गों से संभव हो, एप्लिकेशन डेटा और तर्क के रूप में के रूप में ज्यादा है।

पैटर्न कार्यान्वयन

संदर्भ ऑब्जेक्ट के तहत

, आवेदन/सत्र/अनुरोध/अन्य गुंजाइश लिए करना डेटा ServletContext/HttpSession/HttpRequest/अन्य प्रोटोकॉल विशिष्ट वर्ग में सीधे नहीं डाल रहा है। इसके बजाय, डेटा एक POJO आवरण कक्षा में संग्रहीत किया जाता है, कि तब ServletRequest/HttpSession/HttpRequest/अन्य में बैठता है।

संदर्भ ऑब्जेक्ट मानचित्र में डेटा संग्रहीत कर सकता है, लेकिन इसकी आवश्यकता नहीं है - यह डेटा के लिए प्रासंगिक किसी भी संरचना/प्रारूप में डेटा स्टोर कर सकता है।

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

संदर्भ वस्तु frontmost प्रस्तुति वर्गों (दृश्य, फ्रंट नियंत्रकों, प्रेषक) द्वारा किया जाता है। इन प्रेजेंटेशन क्लाइंट ऑब्जेक्ट्स स्कोप्ड संदर्भ डेटा स्टोर करने के लिए संग्रहीत स्कोप्ड डेटा और contextObject.put को पुनर्प्राप्त करने के लिए contextObject.get को कॉल करते हैं।

यह व्यापार/एकीकरण तर्क में पारित नहीं है। यह मजबूत वस्तुओं को पारित करके, व्यावसायिक वस्तुओं में कई मापदंडों को पारित करने के साधन के रूप में उपयोग नहीं किया जाता है। व्यापार और एकता स्तरों व्यापार प्रतिनिधि, एप्लिकेशन सेवाओं &/या सत्र Facades जो विशिष्ट दृढ़ता से टाइप पैरामीटर का उपयोग करके फ्रंटेड कर रहे हैं।

पैटर्न लाभ

  • Testability: ईकाई परीक्षण केवल एक साधारण POJO उपहास करने के लिए है, न कि एक प्रोटोकॉल विशेष जटिल सर्वर वर्ग की तुलना में की जरूरत है इस तरह के ServletContext के रूप में या HttpRequest
  • लचीलापन & Reusability: कोर आवेदन कक्षाओं की पतली प्रोटोकॉल-विशिष्ट 'प्रेजेंटेशन' परत से स्वतंत्र रूप से काम करता है। इसका अर्थ यह है कि एक एप्लिकेशन प्रोटोकॉल या प्रेजेंटेशन टेक्नोलॉजी (जैसे एचटीएमएल/एचटीटीपी/सर्वलेट और डब्ल्यूएपी/सर्वलेट और एक्सएमएल/एसओएपी/एचटीटीपी/ईजेबी और एचटीएमएल/एचटीटीपी/जेएसएफ) को आसानी से बदल सकता है या जोड़ सकता है।

टिप्पणियाँ

  • एक ऐतिहासिक पैटर्न है
  • एक बहस कर सकते ऐसे CDI, Guice, स्प्रिंग, सीवन, पहले से ही एक प्रोटोकॉल में लागू & दूसरों देना गुंजाइश भंडारण के रूप में है कि निर्भरता इंजेक्शन चौखटे, पर निर्भर तरीका। यानी कि सभी क्षेत्रों को पहले से ही संदर्भ ऑब्जेक्ट्स के रूप में लागू किया गया है, जिसका अर्थ है कि डेवलपर को अतिरिक्त संदर्भ ऑब्जेक्ट्स बनाने के लिए कम मजबूर किया गया है। यह पैटर्न को अस्वीकार नहीं करता है - इसका मतलब है कि सीडीआई ढांचा पहले ही पैटर्न का समर्थन करता है।
  • गलत ढंग से लागू करते हैं, तो एक के साथ समाप्त कर सकते हैं "दर्रा के आसपास जिनॉर्मस संदर्भ आवेदन के दौरान ऑब्जेक्ट्स" antipattern

KaptajnKold का हवाला देते हुए: मुझे लगता है कि आप समझ में आ गया। हालांकि, मुझे यह भी लगता है कि इससे बचने के लिए एक विरोधी पैटर्न है। देखें here

आपकी टिप्पणियां संदर्भ ऑब्जेक्ट के गलत संस्करण का संदर्भ देती हैं। संदर्भ ऑब्जेक्ट स्वयं विरोधी पैटर्न नहीं है।

+2

मुझे विन 32 एपीआई की याद दिलाता है, जहां आपने एक विधि कॉल के लिए एक विशाल वस्तु बनाई है और इसे एक परम के रूप में पारित किया है, जो आईएमओ एक विरोधी पैटर्न था। कई गुण केवल उस विधि विधि के लिए प्रासंगिक थे, यानी खिड़की के आकार और खिड़की के लिए स्थिति। किसी संदर्भ वस्तु के गुण इतने कम नहीं रहना चाहिए, और मौजूदा दायरे में प्रासंगिक और सामान्य होना चाहिए। रूट/पैरेंट विंडो जैसी कुछ गुण मान्य प्रासंगिक जानकारी होगी। उम्मीद है कि लोगों को इस बारे में सोचने और मूल्यांकन करने में मदद मिलती है कि वे पैटर्न का दुरुपयोग कर रहे हैं या नहीं। यह निश्चित रूप से एक सटीक विज्ञान नहीं है। – AaronLS

0

संदर्भ के लिए संदर्भ का उपयोग कर एक वर्ग। इस कोड पर विचार करें

public class BuildTagHandler extends TagHandler { 

     public BuildTagHandler(ServiceContext context) { // constructor 
      this.tagDAO = context.getTagDAO(); 
      this.buildDAO = context.getBuildDAO(); 
     } 

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

है, या एक बड़ी इंटरफेस सभी प्रविष्टियों को शामिल किया गया।

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