वीआईपी श्रोता पैटर्न

सच कहूँ तो, मैंने इस पैटर्न का वर्णन नहीं देखा है, इसलिए मैंने इसके नाम का आविष्कार किया। अगर किसी को सही नाम के बारे में जानकारी है, तो मुझे सुनकर बहुत खुशी होगी। पैटर्न भाषा से बंधा नहीं है, लेकिन इस लेख में मैं 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 { ... //    object SyncRoot { get; } } 


मल्टीथ्रेडेड सेवा (आंतरिक सिंक्रनाइज़ेशन छोड़ा गया) के समर्थन के साथ एक श्रोता:
  public class Listener { public void Initialise() { //   lock (service.SyncRoot) { foreach (var item in service.Items) RegisterItem(item); service.OnServiceChanged += OnServiceChanged; } } public void Shutdown() { //   lock (service.SyncRoot) { service.OnServiceChanged -= OnServiceChanged; foreach (var item in service.Items) UnregisterItem(item); } } ... } 


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

बहुस्तरीय और एकल-थ्रेडेड सेवा विकल्प (आंतरिक सिंक्रनाइज़ेशन छोड़ा गया) के लिए सब्सक्राइबर:
  public class Listener { public void Initialise() { service.OnServiceChanged += OnServiceChanged; } public void Shutdown() { service.OnServiceChanged -= OnServiceChanged; } ... } 


एकल-थ्रेडेड संस्करण के लिए सेवा कार्यान्वयन:
  public class Service : IService { ... public event ServiceChangedHandle OnServiceChanged { add { //      foreach (var item in items) value(this, item, true); //   eventHandle += value; } remove { //   eventHandle -= value; //    foreach (var item in items) value(this, item, false); } } private ServiceChangedHandle eventHandle; private List<IObject> items = new List<IObject>(); } 


किसी भी पैटर्न की तरह, श्रोता के इस संस्करण में इसके पेशेवरों, विपक्ष और गुंजाइश हैं।

पेशेवरों:


विपक्ष:


Minuses और pluses से, हम पैटर्न के दायरे को अलग कर सकते हैं:


Update1
कुछ स्पष्टीकरण:
"ऑब्जर्वर" पैटर्न पहले से ही शार्प में लागू किया गया है, प्रेक्षक और प्रेक्षित के बजाय, हमारे पास एक ईवेंट और सब्सक्राइबर हैं।
VIP शब्द "एक" का पर्यायवाची नहीं है, बल्कि "विशेष" शब्द का पर्याय है। इस मामले में, सभी ग्राहक विशेष हैं क्योंकि देखी गई वस्तु प्रत्येक व्यक्ति पर्यवेक्षक के लिए अलग तरह से व्यवहार करती है। अर्थात्, यह उन घटनाओं को उत्पन्न करता है जो प्रेक्षक छोड़ सकता है या प्रतीक्षा नहीं कर सकता है।

आपका ध्यान देने के लिए आप सभी का धन्यवाद!

Source: https://habr.com/ru/post/In201908/


All Articles