मैंने दो एब्स्ट्रैक्ट क्लासेज सब्जेक्ट और ऑब्जर्वर बनाए हैं जो एक क्लासिक ऑब्जर्वर पैटर्न इंटरफ़ेस को परिभाषित करते हैं। मैं ऑब्जर्वर पैटर्न को लागू करने के लिए उनसे प्राप्त करता हूं। एक पर्यवेक्षक इस तरह दिख सकता है:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
यह ठीक है और यह मुझे बताता है कि किसने कुछ बदला। हालाँकि, यह मुझे नहीं बताता कि क्या बदला। कभी-कभी यह ठीक है क्योंकि मैं केवल नवीनतम डेटा के लिए विषय को क्वेरी करने जा रहा हूं, लेकिन अन्य बार मुझे यह जानना होगा कि वास्तव में विषय में क्या बदलाव हुआ है। मुझे लगता है कि वे जावा में सूचना देते हैं कि दोनों के पास एक InformObservers () विधि और एक InformObservers (ऑब्जेक्ट arg) विधि है जो संभवतः बदले हुए विवरणों को निर्दिष्ट करता है।
मेरे मामले में मुझे यह जानने की आवश्यकता है कि क्या किसी एक जोड़े के विषय पर अलग-अलग कार्रवाई हुई है और यदि यह एक विशेष कार्रवाई है, तो उस कार्रवाई से संबंधित पूर्णांक संख्या जानने के लिए।
तो मेरे सवाल हैं:
- एक सामान्य तर्क पारित करने के लिए C ++ तरीका क्या है (जैसा कि जावा करता है)?
- क्या प्रेक्षक भी सबसे अच्छा पैटर्न है? शायद किसी तरह का इवेंट सिस्टम?
अपडेट करें
मुझे यह लेख मिला जो ऑब्जर्वर पैटर्न को गति देने के बारे में बात करता है: टेम्पलेट्स के साथ एक विषय / प्रेक्षक पैटर्न को लागू करना । इससे मुझे आश्चर्य हुआ कि क्या आप किसी तर्क को खा सकते हैं।
मुझे यह स्टैक ओवरफ्लो प्रश्न मिला जो तर्क को गति देने के बारे में बात करता है: टेम्पलेट आधारित विषय ऑब्जर्वर पैटर्न - क्या मुझे static_cast या डायनामिक_का उपयोग करना चाहिए । हालांकि, ओपी के पास एक समस्या है जो किसी ने उत्तर नहीं दी है।
दूसरी चीज़ जो मैं कर सकता था वह है अपडेट विधि को एक EventArg ऑब्जेक्ट के रूप में बदलने के लिए:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
और फिर विशेष तर्क डेटा के लिए EventArg के उप-वर्ग बनाएं, और फिर मुझे लगता है कि इसे अपडेट विधि के भीतर विशिष्ट उपवर्ग में वापस डाल दिया जाए।
अद्यतन २
एक लेख भी मिला, अतुल्यकालिक संदेश-आधारित सी ++ फ्रेमवर्क बनाने पर; भाग 2 जिसमें विषय के बारे में चर्चा की गई है कि क्या बदला है।
अब मैं गंभीरता से Boost.Signals का उपयोग करने पर विचार कर रहा हूं । अपने स्वयं के पर्यवेक्षक पैटर्न का उपयोग करना समझ में आता है जब यह सरल था, लेकिन प्रकार और एक तर्क को गति देना जटिल होने लगा है। और मुझे Boost.Signals2 की थ्रेड सुरक्षा की आवश्यकता हो सकती है।
अद्यतन 3
मुझे पर्यवेक्षक पैटर्न पर कुछ दिलचस्प लेख भी मिले:
हर्ब सटर द्वारा ऑब्जर्वर को सामान्य बनाना
C ++ - 1 भाग में ऑब्जर्वर पैटर्न को लागू करना
प्रेक्षक के डिजाइन पैटर्न को लागू करने के अनुभव (भाग 2)
प्रेक्षक के डिजाइन पैटर्न को लागू करने के अनुभव (भाग 3)
हालाँकि, मैंने अपने कार्यान्वयन को Boost.Signals के उपयोग से बंद कर दिया है, जबकि संभवतः मेरे उद्देश्यों के लिए फूला हुआ, सफलतापूर्वक काम कर रहा है। और शायद ब्लोट या गति की कोई भी चिंता अप्रासंगिक है।