Sì. Per questo sono tornato al libro originale "Gang of Four" su Design Patterns, quindi ho fatto qualche ricerca online.
Mediator - Define an object that encapsulates how a set of objects
interact. Mediator promotes loose coupling by keeping objects from
referring to each other explicitly, and it lets you vary their
interaction independently. It is responsible for coordinating interactions for a group of objects.
State - Allow an object to alter its behavior when its internal state
changes.
Ecco un esempio di mediatore JavaScript . Vai al fondo per l'utilizzo. Altri esempi possono o non possono essere più rilevanti per te. Ma esemplifica la nozione.
"Instead of using the Observer pattern to explicitly set many-to-many
listeners and events, Mediator allows you to broadcast events globally
across colleagues." — Paul Marcotte
Ecco un codice:
//A State Object is simple encapsulation of runtime activity potentially embedded in Mediator.
var interactionState = { //record state, perhaps array, look up function, or even boolean flag.}
// Un mediatore aggiunge e rimuove i componenti e trasmette eventi.
// Un mediatore scorre gli oggetti aggiunti e lo stato dei riferimenti per determinare se è necessario intervenire.
for (var c in components) {
if (typeof components[c]["on" + e] == "function")
//Add in state comparison
// if ( interactionState...) //is ready to fire action.
//{ fire action }
{
try {
//debug("Mediator calling " + e + " on " + c);
var s = source || components[c];
components[c]["on" + e].apply(s, a);
} catch (err) {
debug(["Mediator error.", e, a, s, err].join(' '));
}
}
}
La tua implementazione del comportamento "apply" è probabilmente diversa e può essere semplificata.
Is there a elegant way to 'subscribe' the handler so that it is only called one time?
Non lo considererei come "limitante degli eventi". Non c'è probabilmente alcun guadagno in termini di prestazioni, comunque. La prospettiva di cui sopra, è quella di introdurre un meccanismo decisionale che dice: "Abbiamo avuto 2 o più oggetti che attivano eventi, facciamo questo compito speciale".
Il mediatore racchiude il meccanismo decisionale, l'oggetto stato racchiude l'accumulo di informazioni in fase di esecuzione. Tieni presente che, a un certo punto, potrebbe essere necessario ripristinare lo stato. Questo comportamento di pulizia sarebbe ragionevole per essere inserito all'interno del Mediatore.
Può benissimo accadere che tu possa far ascoltare il tuo osservatore per gli eventi pubblicati, quindi chiama il mediatore per rivedere lo stato, il che rende la determinazione dell'interazione, se pertinente, quindi trasmette l'evento con le istruzioni per eseguire il loro comportamento speciale.
EDIT: controlla anche le viste Evented. Questo è un articolo eccezionale sull'argomento.