Ho creato due classi astratte: Soggetto e Osservatore che definiscono una classica interfaccia del modello Observer. Derivo da loro per implementare il modello Observer. Un osservatore potrebbe assomigliare a questo:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Questo va bene e mi dice chi ha cambiato qualcosa. Tuttavia, non mi dice cosa è cambiato. A volte questo va bene perché ho intenzione di interrogare l'oggetto per gli ultimi dati, ma altre volte ho bisogno di sapere cosa è cambiato esattamente sull'oggetto. Ho notato in Java che hanno sia un metodo notifyObservers () che un metodo notifyObservers (Object arg) per presumibilmente specificare i dettagli di ciò che è cambiato.
Nel mio caso ho bisogno di sapere se una di una coppia di azioni diverse sono avvenute sull'argomento e, se si tratta di un'azione particolare, di conoscere un numero intero relativo a quell'azione.
Quindi le mie domande sono:
- qual è il modo C ++ per passare un argomento generico (come fa Java)?
- Observer è anche il modello migliore? Forse una specie di sistema di eventi?
AGGIORNARE
Ho trovato questo articolo che parla del modello del modello Observer: Implementazione di un modello soggetto / osservatore con modelli . Questo mi ha fatto domandare se si potesse modellare un argomento.
Ho trovato questa domanda di overflow dello stack che parla del modello dell'argomento: modello di osservatore soggetto basato su modello - Dovrei usare static_cast o dynamic_cast . Tuttavia, l'OP sembra avere un problema a cui nessuno ha risposto.
L'altra cosa che potrei fare è cambiare il metodo di aggiornamento per prendere un oggetto EventArg come in:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
E quindi creare sottoclassi di EventArg per dati di argomenti specifici, quindi immagino di eseguirne il cast nella sottoclasse specifica all'interno del metodo di aggiornamento.
AGGIORNAMENTO 2
Ho anche trovato un articolo sulla creazione di un framework c ++ asincrono basato su messaggi; parte 2 che discute di far comunicare al Soggetto i dettagli di ciò che è cambiato.
Ora sto seriamente pensando di usare Boost.Signals . Usare il mio modello di osservatore aveva senso quando era semplice, ma modellare il tipo e un argomento stava iniziando a complicarsi. E potrei aver bisogno della sicurezza del thread di Boost.Signals2.
AGGIORNAMENTO 3
Ho anche trovato alcuni articoli interessanti sul modello di osservatore:
Generalizing Observer di Herb Sutter
Implementazione del modello di osservatore in C ++ - Parte 1
Esperienze di implementazione del modello di progettazione dell'osservatore (parte 2)
Esperienze di implementazione del modello di progettazione dell'osservatore (parte 3)
Tuttavia, ho passato la mia implementazione all'utilizzo di Boost.Signals che, sebbene possibilmente gonfio per i miei scopi, funziona correttamente. E probabilmente qualsiasi preoccupazione di gonfia o velocità è irrilevante.