Come implementare correttamente una facciata

4

Ho letto più siti Web su questo argomento ma nessuno di questi mi ha fornito una soluzione "valida" per il problema che sto riscontrando. Il problema è descritto nelle seguenti domande (correlate):

  1. Come faccio ad accoppiare il pacchetto UI con il resto del sistema senza un eccessivo accoppiamento con le classi all'interno degli altri pacchetti (sto pensando al modello di facciata).
  2. Ho molte classi di istanze singole, ma non voglio usare il Pattern Singleton per forzare la singola istanza. In alcuni casi ho bisogno di accedere a quelle classi in altri pacchetti.

Vedere la figura seguente per una classe (semplificata) e un diagramma del pacchetto del sistema. Ho una classe ProtocolParser (non il vero nome) che analizza i dati in arrivo e genera eventi quando vengono ricevuti determinati pacchetti. Gli eventi sono gestiti da AnchorManager e TagManager . Quelle classi fanno quasi la stessa cosa. Quando l'evento viene ricevuto, cerca nella loro lista di Ancore o Tag se trova un Ancoraggio o Tag con lo stesso id lo aggiornano con nuovi dati altrimenti creano un nuovo Anchor o Tag . Ho anche classe TrackingDeviceManager questa classe è responsabile di mantenere un elenco di tutti TrackingDevices nel sistema (quindi, ad esempio, l'interfaccia utente può mostrarne una lista).

Non è molto utile avere più istanze delle classi TrackingDeviceManger , AnchorManager e TagManager poiché devono tenere traccia di tutte le TrackingDevices , Ancoraggi o Tag nel sistema. Quindi potrei potenzialmente renderli dei singleton. Ma non credo che il modello singleton sia il modo giusto per andare qui.

Quindi sto pensando di implementare TrackingFacade (singleton e una facciata) questa classe creerà istanze delle tre classi e le inizializzerà. Espone anche alcuni metodi ed eventi pubblici in modo che altre classi in altri pacchetti possano consumarli. Ma mi chiedo se questo è un buon approccio. O dovrei ripensare al mio design?

Diagrammaclassi(semplificato)

Schema del pacchetto

    
posta Faas 10.12.2015 - 17:57
fonte

1 risposta

5

Riguardo ai singleton

Nessuna delle classi qui raffigurate dovrebbe essere un singleton.

L'unica classe che dovrebbe essere un singleton è la principale classe di applicazione, che istanzia le due classi principali che vediamo qui: la classe "Tracking", che è la tua logica applicativa (logica di dominio) e la classe "UI", qual è la tua interfaccia utente.

E per essere sicuri di essere sulla stessa pagina, per "Singleton" intendo una classe che ha un costruttore privato e ha un membro public static final TrackingApplication INSTANCE = new TrackingApplication(); .

Per quanto riguarda le facciate

Il bisogno che hai scoperto è in realtà quello che i modelli architettonici MVC e MVVM sono stati inventati per affrontare.

Senza troppo gergo, quello che hai a sinistra della tua casella "TrackingFacade" sono le classi che compongono il tuo "modello". Quello che vuoi è una classe intermedia tra il tuo modello e il tuo codice UI che offre una "presentazione" uniforme del tuo modello in modo che la tua interfaccia utente possa farne uso invece di preoccuparti dei dettagli del tuo modello. Inoltre, in questa classe intermedia è probabile aggiungere logica "aziendale" (logica dell'applicazione, logica del dominio) che riceve comandi dall'interfaccia utente ed esegue azioni sul modello. (Ecco perché non è solo una facciata.)

In MVC questa classe intermedia può essere approssimativamente considerata il "Controller", mentre in MVVM corrisponde al "ViewModel". Consiglierei di leggere questi schemi architettonici.

    
risposta data 10.12.2015 - 20:36
fonte