Ao projetar uma API que fornece uma interface de escuta de eventos, parece haver duas maneiras conflitantes de tratar chamadas para adicionar / remover ouvintes:
Várias chamadas para addListener adicionarão apenas um único ouvinte (como adicioná-lo a um conjunto); pode ser removido com uma única chamada para removeListener.
Várias chamadas para addListener adicionarão um ouvinte a cada vez (como adicioná-lo a uma lista); deve ser equilibrado por várias chamadas para removeListener.
Encontrei um exemplo de cada um: (1) - A chamada DOM addEventListener nos navegadores apenas adiciona ouvintes uma vez, ignorando silenciosamente as solicitações para adicionar o mesmo ouvinte pela segunda vez e (2) - o .oncomportamento do jQuery adiciona ouvintes várias vezes .
A maioria das outras APIs de ouvintes parece usar (2), como ouvintes de eventos SWT e Swing. Se (1) for escolhido, há também a questão de saber se deve falhar silenciosamente ou com um erro quando houver uma solicitação para adicionar o mesmo ouvinte duas vezes.
Nas minhas implementações, costumo seguir com (2), uma vez que fornece uma interface mais limpa do tipo configuração / desmontagem e revela bugs em que a 'instalação' é feita acidentalmente duas vezes e é consistente com a maioria das implementações que já vi.
Isso me leva à minha pergunta - Existe uma arquitetura específica ou outro design subjacente que se presta melhor à outra implementação? (ou seja: por que o outro padrão existe?)
foo== bar, ele seria substituído, caso contrário, ele teria um fooe um barcomo ouvintes. Se sempre sobrescrevesse, não seria um conjunto, mas um único objeto que representava um observador.
addListener(foo); addListener(foo); addListener(bar);. O seu caso nº 1 adiciona umfooe umbar, ou apenasbar(ou seja,barsobrescrevefoocomo ouvinte)? No caso 2,foodispararia duas ou uma vez?