Ho creato due classi astratte Soggetto e Osservatore che definiscono una classica interfaccia per modelli Observer. Io traggo da loro per implementare il modello di Osservatore. Un osservatore potrebbe apparire come 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 è ok perché sto solo andando a interrogare il soggetto per gli ultimi dati, ma altre volte ho bisogno di sapere cosa esattamente cambiato sull'oggetto. Ho notato che in Java hanno sia un metodo notifyObservers () che un notifyObservers (Object arg) metodo per presumibilmente specificare i dettagli su cosa è cambiato.
Nel mio caso ho bisogno di sapere se una di una coppia di azioni diverse è accaduta 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?
Aggiorna
Ho trovato questo articolo che parla del modello di Observer: Implementazione di un pattern soggetto / osservatore con modelli . Questo mi ha fatto domandare se potessi definire un argomento.
Ho trovato questa domanda di overflow dello stack che parla del modello dell'argomento: Modello di osservatore soggetto basato su modello - Devo 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)
{
...
Quindi creare sottoclassi di EventArg per dati specifici sugli argomenti, quindi suppongo di ricondurli alla sottoclasse specifica all'interno del metodo di aggiornamento.
UPDATE 2
Trovato anche un articolo, Sulla creazione di un framework c ++ basato su messaggi asincroni; parte 2 in cui si discute se l'Oggetto comunica dettagli su cosa è cambiato.
Ora sto seriamente pensando di utilizzare Boost.Signals . Usare il mio schema di osservatore aveva senso quando era semplice, ma il templating del tipo e un argomento cominciavano a complicarsi. E potrei aver bisogno della sicurezza del thread di Boost.Signals2.
UPDATE 3
Ho trovato anche alcuni articoli interessanti sul modello di osservatore:
Generalizing Observer di Herb Sutter
Implementazione del pattern 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 spostato la mia implementazione sull'uso di Boost.Signals che, anche se probabilmente è gonfio per i miei scopi, sta funzionando con successo. E probabilmente qualsiasi preoccupazione di aumento di velocità o di velocità è irrilevante.