Un'alternativa sarebbe la seguente.
Gli osservatori vengono avvisati dell'evento attraverso il metodo
// Method on all observers.
void notify(Event event)
Tutti i nuovi oggetti sono iscritti alla notifica, quindi l'oggetto, invece
di
if (subject.eventAlreadyHappened()) {
observer.executeStuff();
} else {
subject.subscribe(observer);
}
semplicemente
subject.subscribe(observer);
Quando si verifica l'evento, l'osservatore iscritto viene avvisato e l'evento viene memorizzato nella cache:
// Method on subject.
void handleEvent(Event event)
{
// lastEvent is a member variable of subject.
lastEvent = event;
...
for (Observer observer : subscribedObservers())
{
observer.notify(event);
}
}
Quando un nuovo oggetto è sottoscritto, viene notificato immediatamente se l'evento
si è già verificato:
// Method on subject.
void subscribe(Observer observer)
{
// Add observer to list.
...
if (lastEvent != null)
{
observer.notify(lastEvent);
}
}
Infine, l'osservatore ha un metodo di notifica:
// Method on observer.
void notify(Event event)
{
executeStuff();
}
Quindi sostanzialmente la differenza è che il soggetto invia immediatamente
una notifica a un oggetto appena sottoscritto se al momento della sottoscrizione
l'evento si è già verificato.
Spero che questo aiuti.