the paper से सीधे हवाला देते हुए: माउस खींचकर:
पर्यवेक्षक पैटर्न, हम एक सरल और सर्वव्यापी उदाहरण के साथ शुरू की सटीक समस्याओं इसे समझने के लिए। निम्न उदाहरण एक Path
वस्तु में एक खींचें आपरेशन के दौरान माउस के आंदोलनों के निशान और स्क्रीन पर प्रदर्शित करता है यह। चीजों को सरल रखने के लिए, हम स्काला क्लोजर पर्यवेक्षकों के रूप में उपयोग करते हैं।
var path: Path = null
val moveObserver = { (event: MouseEvent) =>
path.lineTo(event.position)
draw(path)
}
control.addMouseDownObserver { event =>
path = new Path(event.position)
control.addMouseMoveObserver(moveObserver)
}
control.addMouseUpObserver { event =>
control.removeMouseMoveObserver(moveObserver)
path.close()
draw(path)
}
ऊपर के उदाहरण हैं, और हम के रूप में में [25] सामान्य रूप में, महत्वपूर्ण सॉफ्टवेयर इंजीनियरिंग के सिद्धांतों के एक प्रभावशाली लाइन अप का उल्लंघन करती है परिभाषित पर्यवेक्षक पैटर्न का तर्क के रूप में:
दुष्प्रभाव पर्यवेक्षक साइड इफेक्ट्स को बढ़ावा देते हैं। चूंकि पर्यवेक्षक स्टेटलेस हैं, इसलिए हमें अक्सर को ड्रैग उदाहरण के रूप में एक राज्य मशीन अनुकरण करने के लिए उनमें से कई की आवश्यकता होती है। हमें राज्य को सहेजना है जहां यह सभी शामिल पर्यवेक्षकों जैसे उपरोक्त path
में पहुंच योग्य है।
Encapsulation राज्य चर path
पर्यवेक्षकों के दायरे निकल जाता है के रूप में, पर्यवेक्षक पैटर्न कैप्सूलीकरण टूट जाता है।
Composability एकाधिक पर्यवेक्षकों के रूप में वस्तुओं है कि एक ही चिंता का विषय से निपटने का एक ढीला संग्रह (या एकाधिक, अगले अंक देखें)। चूंकि कई पर्यवेक्षक पर विभिन्न बिंदुओं पर अलग-अलग बिंदुओं पर स्थापित होते हैं, उदाहरण के लिए, आसानी से उन्हें पूरी तरह से निपटाने के लिए नहीं कर सकते हैं। चिंताओं के
पृथक्करण ऊपर पर्यवेक्षकों केवल माउस पथ का पता लगाने नहीं लेकिन यह भी एक ड्राइंग आदेश कॉल करें, या अधिक आम तौर पर, एक ही कोड स्थान में दो अलग अलग चिंताओं में शामिल हैं। पथ बनाने और इसे प्रदर्शित करने की चिंताओं को अलग करने के लिए अक्सर बेहतर होता है, उदाहरण के लिए, मॉडल-व्यू-कंट्रोलर (एमवीसी) [30] पैटर्न में ।
Scalablity हम रास्तों कि खुद घटनाओं प्रकाशित करता है जब पथ में परिवर्तन के लिए एक वर्ग बनाने के द्वारा हमारे उदाहरण में चिंताओं में से एक जुदाई को प्राप्त कर सकता है। दुर्भाग्यवश, पर्यवेक्षक पैटर्न में डेटा स्थिरता के लिए गारंटी नहीं है। मान लीजिए कि हम एक और ईवेंट प्रकाशन ऑब्जेक्ट प्रकाशित करेंगे जो हमारे मूल पथ में परिवर्तनों पर निर्भर करता है, उदाहरण के लिए, एक आयताकार जो हमारे पथ की सीमाओं का प्रतिनिधित्व करता है। एक पर्यवेक्षक को पथ और इसकी सीमाओं में फ़्रेम किए गए पथ को आकर्षित करने के लिए परिवर्तनों को सुनने पर विचार करें। यह पर्यवेक्षक को मैन्युअल रूप से यह निर्धारित करने की आवश्यकता होगी कि सीमाएं पहले ही अपडेट हो चुकी हैं और यदि नहीं, तो चित्र ऑपरेशन को रोकें। अन्यथा उपयोगकर्ता पर एक फ्रेम देख सकता है जिसमें गलत आकार (एक गड़बड़) है।
समानता विभिन्न पर्यवेक्षकों को स्थापित करने के लिए विभिन्न विधियां कोड एकरूपता को कम करें।
अमूर्त उदाहरण में कम स्तर का अमूर्तता है। यह कक्षा के हेवीवेट इंटरफ़ेस पर निर्भर करता है जो माउस ईवेंट पर्यवेक्षकों को स्थापित करने के लिए केवल विशिष्ट विधियों से अधिक प्रदान करता है। इसलिए, हम सटीक घटना स्रोतों पर अमूर्त नहीं कर सकते हैं। उदाहरण के लिए, हम उपयोगकर्ता को कुंजी से बचकर ड्रैग ऑपरेशन को रोक सकते हैं या टच स्क्रीन या ग्राफिक्स टैबलेट जैसे विभिन्न पॉइंटर डिवाइस का उपयोग कर सकते हैं।
संसाधन प्रबंधन एक पर्यवेक्षक का जीवन-समय ग्राहकों द्वारा प्रबंधित किया जाना चाहिए। प्रदर्शन कारणों से, हम केवल ड्रैग ऑपरेशन के दौरान माउस मूव ईवेंट देखना चाहते हैं। इसलिए, हमें को स्पष्ट रूप से स्थापित करने और माउस चाल पर्यवेक्षक को अनइंस्टॉल करने की आवश्यकता है और हमें को स्थापना के बिंदु (ऊपर नियंत्रण) याद रखना होगा।
सिमेंटिक दूरी अंत में, उदाहरण के को समझने के लिए, क्योंकि नियंत्रण प्रवाह उलटी, जो बहुत ज्यादा बॉयलरप्लेट कोड है कि प्रोग्रामर इरादा और वास्तविक कोड के बीच अर्थ दूरी बढ़ जाती है में परिणाम कठिन है।
[25] ई। गामा, आर। हेल्म, आर जॉनसन, और जे। Vlissides। डिजाइन पैटर्न: पुन: प्रयोज्य ऑब्जेक्ट उन्मुख सॉफ़्टवेयर के तत्व। एडिसन-वेस्ले लॉन्गमैन पब्लिशिंग कं, इंक, बोस्टन, एमए, यूएसए, 1 99 5। आईएसबीएन 0-201-63361-2।
यहां भी चर्चा की गई ... http://lambda-the-ultimate.org/node/4028 –