In primo luogo, proverò a descrivere il modello del mondo reale di ciò che stiamo cercando di esprimere nel codice C #.
Abbiamo un dispositivo chiamato M100. Lo scopo è leggere \ scrivere dati da \ sulle carte (carte plastiche o ULTRALIGHT come MIFARE). Può essere con un massimo di 3 antenne (il dispositivo legge \ scrive dati tramite antenna). Una delle antenne è interna (quindi la scheda può essere posizionata sulla superficie del dispositivo e il dispositivo sarà in grado di eseguire operazioni di lettura \ scrittura), l'altra esterna. Consideriamo la solita situazione. Abbiamo un punto di servizio terminale. M100 risiede all'interno del terminale e ha due antenne esterne che sono posizionate su un distributore di carte. Il distributore di carte è un altro dispositivo che è responsabile dell'accettazione e dell'erogazione di carte per l'esecuzione di operazioni di lettura \ scrittura da parte di M100. Quindi, il distributore di carte prende la carta dall'utente, la sposta nella posizione di lettura \ scrittura e dopo di ciò M100 può eseguire operazioni di lettura \ scrittura. M100 può essere equipaggiato con una sola antenna (interna). Quindi dobbiamo fare i casi principali: con e senza distributori di carte.
Abbiamo un'applicazione che interagisce con i distributori e l'altra utilizza M100 senza distributori di carte.
Abbiamo sviluppato M100Provider con la sua interfaccia IM100Provider. Questa è la classe di basso livello che interagisce direttamente con M100, passa i comandi attraverso la porta COM.
Abbiamo operazioni di livello più elevato come AuthorizeOperator, WriteTicket, ReadCard (tutte queste operazioni richiedono M100) così abbiamo sviluppato la classe M100Communicator (forse il nome non riflette la sua intenzione al momento, ma penseremo al nome un po 'tardi). M100Communicator è un singleton. Perché abbiamo bisogno di manipolare i distributori di carte per accettare e distribuire le schede degli utenti M100Communicator interagisce con la classe CardDispensersManager. Non abbiamo ancora deciso se sarà composto in M100Communicator o sarà un singleton (sembra che sia un singleton).
Tutte queste operazioni devono essere eseguite in un modo unificato:
- Blocca l'oggetto corrente.
- Controlla se ci sono alcuni distributori configurati
- Se lo sono - passa loro un comando per aprire il trattino per l'accettazione della carta.
- Passa a M100 un comando per cercare una carta attraverso antenne specifiche.
- Una volta trovata la carta, eseguire le operazioni di lettura \ scrittura.
- Erogare la carta di nuovo all'utente.
Ecco i problemi che dobbiamo affrontare:
- Considerando che M100Communicator a volte non richiede CardDispensersManager, siamo costretti a controllare lo stato su riferimento null ovunque (e sarà piuttosto strano avere un caso speciale CardDispensersManager che restituirà risposte significative mentre non ci sono dispensatori!).
- M100Communicator e CardDispensersManager devono essere inizializzati dall'inizio del sistema, quindi non è chiaro come aggiornare la configurazione di CardDispensersManager e M100Communicator e come comunicare con CardDispensersManager direttamente quando vogliamo chiudere le porte e interrompere la comunicazione con i distributori in modo esplicito, perché sarà molto strano esporre i dispensatori API tramite M100Communicator. (sì, abbiamo l'obbligo di poter accedere alle API dei distributori da qualsiasi luogo, quindi pensiamo che CardsDispenserManager debba essere un singleton).