Sim. Para isso, voltei ao livro original "Gang of Four" em Design Patterns e fiz algumas pesquisas on-line.
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.
Aqui está um exemplo de mediador JavaScript . Pule para o fundo para uso. Outros exemplos podem ou não ser mais relevantes para você. Mas isso exemplifica a noção.
"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
Aqui está um código:
//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.}
// Um mediador adiciona e remove componentes e transmite eventos.
// Um mediador faz um loop através de objetos adicionados e estado de referências para determinar se a ação deve ser tomada.
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(' '));
}
}
}
Sua implementação do comportamento "aplicar" provavelmente é diferente e pode ser simplificada.
Is there a elegant way to 'subscribe' the handler so that it is only called one time?
Eu não pensaria nisso como "limitar os eventos". Provavelmente, não há ganho real de desempenho fazendo isso de qualquer maneira. A perspectiva acima, é introduzir um mecanismo de decisão que diz: "Nós tivemos 2 ou mais objetos disparando eventos, vamos fazer essa tarefa especial".
O mediador encapsula o mecanismo de decisão, o objeto de estado encapsula o acúmulo de informações em tempo de execução. Tenha em mente que, em algum momento, o estado pode precisar ser redefinido. Este comportamento de limpeza seria sensato para ser colocado dentro do mediador.
Pode muito bem acontecer de você ter o seu Observer ouvindo os eventos publicados e, em seguida, chamar o Mediador para revisar o Estado, o que determina a interação, se for relevante, e então transmite o evento com instrução para executar o evento. comportamento especial.
EDIT: Confira também as Views Evented. Este é um artigo excepcional sobre o assunto.