सच कहूँ तो, मैंने इस पैटर्न का वर्णन नहीं देखा है, इसलिए मैंने इसके नाम का आविष्कार किया। अगर किसी को सही नाम के बारे में जानकारी है, तो मुझे सुनकर बहुत खुशी होगी। पैटर्न भाषा से बंधा नहीं है, लेकिन इस लेख में मैं
C#
उपयोग करूंगा।
ध्यान आकर्षित करने के लिए चित्र:
तो एक ऐसी प्रणाली की कल्पना करें जिसमें एक सेवा हो जो वस्तुओं के एक सेट को ट्रैक करने के लिए सिस्टम के अन्य भागों को प्रदान करती है। यह एक सिमुलेशन सेवा हो सकती है जो नकली वस्तुओं या किसी अन्य समान की एक सूची प्रदान करती है।
सिस्टम द्वारा उत्पन्न और नष्ट की गई वस्तुएं:
public interface IObject { }
वस्तुओं तक पहुंच प्रदान करने वाली सेवा:
public delegate void ServiceChangedHandle(IService sender, IObject item, bool injected); public interface IService { IEnumerable<IObject> Items { get; } event ServiceChangedHandle OnServiceChanged; }
उन प्रणालियों को जो वस्तुओं के साथ काम करने की आवश्यकता होती है, उन्हें नई वस्तुओं की उपस्थिति और वर्तमान के गायब होने को ट्रैक करने के लिए घटना की सदस्यता दी जाती है।
एक सामान्य श्रोता उदाहरण:
public class Listener { public void Initialise() { foreach (var item in service.Items) RegisterItem(item); service.OnServiceChanged += OnServiceChanged; } public void Shutdown() { service.OnServiceChanged -= OnServiceChanged; foreach (var item in service.Items) UnregisterItem(item); } private void OnServiceChanged(IService sender, IObject item, bool injected) { if (injected) RegisterItem(item); else UnregisterItem(item); } private void RegisterItem(IObject item) { ... } private void UnregisterItem(IObject item) { ... } private IService service; }
जब श्रोता सक्रिय होता है, तो यह उन सभी वस्तुओं को संसाधित करता है जो पहले से ही सेवा में मौजूद हैं और उसके बाद वस्तुओं की सूची में परिवर्तन करने के लिए सदस्यता लेते हैं। श्रोता का काम पूरा होने पर, उल्टे कार्यों को अंजाम देना आवश्यक है।
बहु-थ्रेडेड प्रोग्रामिंग के साथ, चीजें जटिल हो जाती हैं, क्योंकि मतदान और सदस्यता के बीच, वस्तुओं की सूची बदल सकती है। सेवा को एक सिंक्रनाइज़ेशन ऑब्जेक्ट प्रदान करना होगा और श्रोता सूची और सदस्यता को क्रॉल करने के बीच सूची परिवर्तन को रोक देगा।
मल्टीथ्रेडिंग समर्थन के साथ सेवा:
public interface IService { ...
मल्टीथ्रेडेड सेवा (आंतरिक सिंक्रनाइज़ेशन छोड़ा गया) के समर्थन के साथ एक श्रोता:
public class Listener { public void Initialise() {
आप सदस्यता प्रणाली को थोड़ा सरल कर सकते हैं यदि आप गारंटी देते हैं कि सदस्यता और सदस्यता के समय सेवा में कोई ऑब्जेक्ट नहीं हैं। ऐसी गारंटी देना मुश्किल है, खासकर उन प्रणालियों में जहां सेवाओं की उपस्थिति का समय परिभाषित नहीं है।
लेकिन आप प्रत्येक ग्राहक के लिए इस गारंटी का अनुकरण कर सकते हैं, यह पैटर्न का सार है। सदस्यता लेते समय, सेवा सभी मौजूदा वस्तुओं के लिए एक वस्तु उपस्थिति घटना को जबरन भेज देगी, और जब सदस्यता समाप्त हो जाएगी, तो एक विलुप्त होने की घटना भेजें। उसी समय, श्रोता सरल हो जाता है, और एक बहु-थ्रेडेड और एकल-थ्रेडेड संस्करण के लिए, यह एक ही दिखेगा।
बहुस्तरीय और एकल-थ्रेडेड सेवा विकल्प (आंतरिक सिंक्रनाइज़ेशन छोड़ा गया) के लिए सब्सक्राइबर:
public class Listener { public void Initialise() { service.OnServiceChanged += OnServiceChanged; } public void Shutdown() { service.OnServiceChanged -= OnServiceChanged; } ... }
एकल-थ्रेडेड संस्करण के लिए सेवा कार्यान्वयन:
public class Service : IService { ... public event ServiceChangedHandle OnServiceChanged { add {
किसी भी पैटर्न की तरह, श्रोता के इस संस्करण में इसके पेशेवरों, विपक्ष और गुंजाइश हैं।
पेशेवरों:
- सब्सक्राइबर्स को सरलीकृत किया जाता है, बस एक साधारण सदस्यता और सदस्यता समाप्त होती है
- मल्टी-थ्रेडेड और सिंगल-थ्रेडेड दोनों संस्करणों के लिए समान कोड
विपक्ष:
- उपयोग करते समय, आपको सेवा की इस विशेषता को जानना होगा ताकि वस्तुओं को दो बार संसाधित न किया जाए
Minuses और pluses से, हम पैटर्न के दायरे को अलग कर सकते हैं:
- कम संख्या में सेवाओं की उपस्थिति और बड़ी संख्या में ग्राहक
- किसी कंपनी का आंतरिक उत्पाद या विशुद्ध रूप से व्यक्तिगत, इस तरह के व्यवहार को उजागर करना खतरनाक है
- डिजाइन और विकास का सख्त अनुशासन। प्रत्येक डेवलपर को इस व्यवहार के बारे में पता होना चाहिए और पता होना चाहिए कि यह पैटर्न विशेष रूप से कहां उपयोग किया जाता है।
Update1कुछ स्पष्टीकरण:
"ऑब्जर्वर" पैटर्न पहले से ही शार्प में लागू किया गया है, प्रेक्षक और प्रेक्षित के बजाय, हमारे पास एक ईवेंट और सब्सक्राइबर हैं।
VIP शब्द "एक" का पर्यायवाची नहीं है, बल्कि "विशेष" शब्द का पर्याय है। इस मामले में, सभी ग्राहक विशेष हैं क्योंकि देखी गई वस्तु प्रत्येक व्यक्ति पर्यवेक्षक के लिए अलग तरह से व्यवहार करती है। अर्थात्, यह उन घटनाओं को उत्पन्न करता है जो प्रेक्षक छोड़ सकता है या प्रतीक्षा नहीं कर सकता है।
आपका ध्यान देने के लिए आप सभी का धन्यवाद!