Object Communication Design

1

Più sistemi di primo livello che comunicano tra loro tramite messaggi (eventi / comandi).

La classe Main del programma avvolge tutti i sistemi e ha un componente di distribuzione messaggi che consegna messaggi da un sistema a un altro. Ogni sistema contiene molti oggetti che devono comunicare tra loro, tuttavia questi messaggi non riguardano necessariamente altri sistemi.

La mia attuale implementazione è la seguente: ogni listener registrato ha un oggetto (hashmap) "subscribedEvents" con callback per gli eventi interessati (messaggi), ma per evitare che gli oggetti interni di un sistema inviino i loro messaggi attraverso il dispacher principale essi avrebbe un dispaccio personale. Il problema che ho con questo approccio è come identificare ogni dispatcher, dal momento che gli oggetti interni devono essere ancora in grado di ascoltare i messaggi di livello superiore e l'oggetto "subscribedEvents" dovrebbe diventare

 subscribedEvents[dispacherId].eventCallback

Quale sarebbe il modo corretto di aggiungere identificatori ai dispatcher? Un dispatcher è solo un componente di una classe (sistema o oggetto interno) e ciascun dispatcher non è a conoscenza degli altri. Posso solo pensare ad una fabbrica di eventDispatcher singleton, ma non mi sembra una soluzione molto elegante.

PS: sono aperto a un approccio completamente nuovo e completamente diverso per affrontare la comunicazione, questo è proprio quello che mi è venuto in mente.

    
posta luleksde 06.10.2015 - 10:49
fonte

1 risposta

1

Hai bisogno di un servizio di localizzazione (un esempio di uno è il DNS) in cui ogni ascoltatore personale può registrarsi con un genitore, eventualmente portando a quei genitori che sono figli di un altro genitore a turno fino a quando non si arriva a una radice. Questo ti consente di trasmettere messaggi ricevuti da un genitore a tutti i bambini che si sono registrati per ricevere quei messaggi.

Se sai quale dispatcher ti invia un messaggio puoi inviarlo direttamente, altrimenti puoi chiedere alla root di individuare quello che vuoi (non conosco i tuoi criteri per questo). In alternativa puoi inviare il messaggio alla radice e lasciarlo propagare il messaggio a tutti i suoi figli e ai loro figli. Utilizza un messaggio di richiesta di posizione per questo e diventa facile da implementare.

Questo tipo di sistema federato funziona bene, ma fai attenzione a non trasmettere tutti i messaggi, dovresti filtrarli consentendo a ciascun dispatcher di dire che tipo di messaggi ti interessa e di non inviarli mai ad altri. Questo aiuta a ridimensionarlo. Significa anche che puoi aggiungere nuovi servizi in modo molto semplice, devi solo inserirli nel sistema e ognuno inizierà a elaborare i messaggi come per magia.

    
risposta data 06.10.2015 - 10:59
fonte