Klasik bir Observer desen arayüzü tanımlayan iki soyut ders konusu olan Subject and Observer oluşturdum. Gözlemci modelini uygulamak için onlardan türeyim. Bir gözlemci şöyle görünebilir:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Bu iyi ve bana kimin bir şeyi değiştirdiğini söylüyor . Ancak, bana neyin değiştiğini söylemiyor . Bazen bu son çünkü sadece en son veriler için Konu sorgulamak için gidiyorum, ama diğer zamanlarda ben Konu tam olarak ne değiştiğini bilmek gerekir. Java fark onlar muhtemelen ne hakkında ayrıntıları belirtmek için bir notifyObservers () yöntemi ve bir notifyObservers (Object arg) yöntemi var.
Benim durumumda, konu üzerinde birkaç farklı eylemden birinin olup olmadığını bilmem ve belirli bir eylem ise, bu eylemle ilgili bir tamsayı numarasını bilmem gerekiyor.
Yani sorularım:
- (Java'nın yaptığı gibi) genel bir bağımsız değişkeni iletmenin C ++ yolu nedir?
- Observer en iyi kalıp mı? Belki bir tür olay sistemi?
GÜNCELLEME
Gözlemci kalıbının şablonlaştırılması hakkında konuşan bu makaleyi buldum: Şablonlarla bir Konu / Gözlemci kalıbı uygulama . Bu bana bir argüman tasarlayıp yazamayacağınızı merak ettirdi.
Ben argüman templasyonu hakkında konuşuyor bu yığın taşma sorusunu buldum: Şablon tabanlı Konu Gözlemci desen - static_cast veya dynamic_cast kullanmalıyım . Ancak, OP'nin kimsenin cevaplamadığı bir sorunu var gibi görünüyor.
Yapabileceğim diğer bir şey, bir EventArg nesnesini olduğu gibi almak için Update yöntemini değiştirmek:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
Ve sonra belirli argüman verileri için EventArg alt sınıfları oluşturun ve sonra güncelleme yöntemi içinde belirli bir alt sınıfa geri tahmin sanırım.
GÜNCELLEME 2
Ayrıca, bir zaman uyumsuz ileti tabanlı c ++ çerçevesi oluşturma hakkında bir makale bulundu ; Öznenin neyin değiştiği hakkında bilgi vermesini tartışan bölüm 2 .
Şimdi ciddi olarak Boost.Signals kullanmayı düşünüyorum . Kendi gözlemci modelimi kullanmak basitken mantıklıydı, ancak türü ve argümanı değiştirmek karmaşıklaşmaya başlıyor. Ve Boost'un iş parçacığı güvenliğine ihtiyacım olabilir.
GÜNCELLEME 3
Gözlemci modeliyle ilgili bazı ilginç makaleler de buldum:
Herb Sutter'in Gözlemcilerini Genelleştirmek
C ++ 'da Gözlemci Deseni Uygulama - Bölüm 1
Gözlemci Tasarımını Uygulama Deneyimleri (Bölüm 2)
Gözlemci Tasarımını Uygulama Deneyimleri (Bölüm 3)
Ancak, benim uygulama muhtemelen Boost.Signals kullanmaya geçiş yaptım, hangi muhtemelen benim amaç için biraz şişirilmiş olsa da, başarılı bir şekilde çalışıyor. Ve muhtemelen herhangi bir şişkinlik veya hız endişesi önemsizdir.