Pubblica / sottoscrivi, domanda di implementazione del modello di osservatore

4

Sto sviluppando un'applicazione desktop in java / swing.

Ho un componente che è registrato come sottoscrittore di molti pannelli e riceve messaggi (il mio evento personalizzato) da loro. Quel componente è qualcosa come message tray. Quando c'è un errore di convalida o qualche tipo di messaggio informativo, viene consegnato dal pannello a quel vassoio con il mio metodo "pubblica".

Ma ora sto affrontando un problema. Ho una finestra che comprende la mia barra dei messaggi e il pannello interno. in questo pannello interno ci sono alcuni componenti e altri pannelli. E in questo pannello ci sono pannelli che implementano l'interfaccia Publisher ma sono stati creati al volo dai metadati e non ho accesso a loro per registrare un sottoscrittore.

Quindi non posso registrare direttamente la mia message tray come subscriber ai pannelli perché:

  1. Non ho accesso ad essi
  2. sono creati dinamicamente dai metadati e possono essere modificati.

Va bene impostare il mio riferimento all'oggetto sottoscrittore nei pannelli centrali (tra) e, quando si creano dinamicamente, i miei pannelli dei publisher registrano tale riferimento?

Va bene con lo schema dell'osservatore perché ora altre classi fanno riferimento all'oggetto di cui non hanno strettamente bisogno.

Forse questo oggetto dovrebbe essere iniettato in altro modo? o forse è tutto OK e oggi mi sono incasinato;)

    
posta coolig 08.08.2013 - 21:44
fonte

2 risposte

1

Ci sono due possibilità:

  1. Passa la "barra dei messaggi" a qualsiasi componente ne abbia bisogno
  2. Rendi ciascun componente che può avere i controlli implementa l'interfaccia "vassoio". In questo modo, il titolare dei pannelli interni è anche un vassoio e può inviare i messaggi al suo vassoio principale (se presente).

Mi piace di più # 2 perché ti permette di essere più flessibile nel modo in cui la gerarchia dei controlli è simile (alias, un controllo che è vassoio potrebbe decidere che solo alcuni messaggi sono passati ai genitori). Inoltre, in questo progetto, ogni bambino ha solo un riferimento al genitore e il genitore decide cosa fare con i messaggi in arrivo.

    
risposta data 08.08.2013 - 21:53
fonte
3

Il tuo design non viola in realtà il pattern Observer, perché il pattern non specifica come gli iscritti si registrino con il publisher. Ma stai violando il Principio di Responsabilità Unica per quei pannelli intermedi, perché a loro viene data la responsabilità aggiuntiva di aiutare a ottenere la sottoscrizione della barra dei messaggi.

Un design migliore sarebbe utilizzare una seconda incarnazione del pattern Observer tra la barra dei messaggi e il componente che crea dinamicamente quei pannelli. Attraverso questa sottoscrizione, la barra dei messaggi può essere informata che è stato creato un nuovo Pannello (insieme a un handle / riferimento / puntatore a quel Pannello), quindi può iscriversi con quel Pannello per i messaggi.

    
risposta data 09.08.2013 - 09:37
fonte

Leggi altre domande sui tag