Vista la similitudine tra le tre parti e tenuto conto che i macroblocchi ConsoleAnchorman, ConsoleCompetitor e DisplayP sono indicativi solo della prossimita' "geografica" delle rispettive sottoparti, si procede a realizzare un unico componente che mostri un valore nella base di visualizzazione corretta.
Nella fase di analisi si e' lasciata la liberta' di scelta sulle modalita' di interfacciamento tra i display e il sottosistema GameController. Le possibilita' sono 2:
Si poteva scegliere se legare direttamente i Display a CounterController oppure introdurre un sottosistema che faccia da Mediatore tra le due parti. Appoggiandosi alla seconda possiblita' si riducono anche le interconnessioni dirette tra parti del sistema. Non essendo a conoscenza di un Mediator gia' realizzato si e' deciso di costruirne uno, il piu' semplice possibile ex-novo, consapevoli della possibilita' di sostituirlo o adattarlo in un secondo momento ad un prodotto di terze parti.
Si e' deciso di realizzare i Pulsanti ereditandoli da una classe Button astratta che contiene le operazioni comuni per ridurre al minimo il codice da scrivere per ogni nuovo pulsante.
Si lasciata aperta la possiblita' di scegliere il dispositivo di ingresso, pur realizzando per ora solo un componente grafico.
Per agevolare la costruzione delle console ci si affida al pattern Factory. All'interno di IConsole e' presente la possibilita' di ottenere i 3 sottosistemi ConsoleAnchorman, ConsoleCompetitor e DisplayP grazie ai metodi getInstance della Factory. In questa maniera il setup del sistema risulta piu' semplice da realizzare.
E' la parte principale del sistema. Per la scelta motivata poco sopra e' stato disaccoppiato dai Display. Per favorire la riusabilita' si e' data la possibilita' di disabilitare la notifica del valore attuale del contatore se non e' interconnesso con il mediatore.
La responsabilita' di verifica del vincolo di sincronia tra i display e' delegata in parte al componente mediatore che deve notificare al CounterController l'avvenuta visualizzazione da parte di tutti i display connessi al sistema e interessati al valore attuale del contatore. L'azione da compiere in caso di mancata sincronia e' rimasta responsabilita' esclusiva di CounterController.
Se ne e' gia' discusso molto in analisi. CounterController dovra' pilotare in base ai segnali start e stop provenienti dal mediatore, il sottosistema ICounterE appoggiandosi alla sua interfaccia.
La notifica del punteggio ai display interessati a questo dato rimane responsabilita' diretta di CounterController coadiuvata dalla mediazione di IHumanDevicesController (il mediatore) per quel che riguarda la parte di comunicazione ai display. Viene realizzata una sottoparte dedicata alla gestione del punteggio (ScoreCollector) che si occupera' anche di verificare a seguito della pressione del tasto stop notificata a CounterController l'assegnazione dei punti in base al valore attuale fornito da ICounterE.
Assieme a CounterController e' la parte centrale del sistema. Non e' un elemento assolutamente indispensabile. Lo si e' introdotto principalmente per scaricare parte delle responsabilita' di CounterController. Ha in se' la possibilita' di controllare un numero imprecisato di ingressi e uscite. Nasconde a counter controller er la connessione diretta con ognuno dei dispositivi fornendo all'atto della notifica di un nuovo valore di contatore solo la segnalazione che la notifica e' arrivata con successo su tutti i dispositivi a lui connessi.
Il prototipo in versione 1 non e' stato pensato esplicitamente per funzionare in uno spazio non coeso poiche' non e' un requisito del cliente. Se si decidesse di far girare l'applicazione in uno spazio non coeso, HumanDevicesController e' il punto di attacco migliore per distribuire i pezzi sostituendolo, smembrandolo oppure adattandolo al canale di comunicazione. Lasciando, di fatto, intatta tutta la businness logic dei sottosistemi a lui interconnessi