Ingegneria del Software - Esercitazione 4

Prima parte

Il seguente diagramma delle classi UML rappresenta una soluzione basata sul design pattern Observer in cui sono presenti il soggetto concreto ClockTimer e due osservatori concreti, ovvero un orologio analogico AnalogClock e un orologio digitale DigitalClock:
[Diagramma partecipanti Observer Clock]
Il soggetto concreto impartisce ogni secondo una notifica di aggiornamento che deve essere recepita dai due osservatori, i quali visualizzeranno l'ora aggiornata mediante il metodo Draw().
Implementare in C# la soluzione rappresentata nel diagramma, definendo i metodi Draw() delle classi AnalogClock e DigitalClock in maniera semplice, ovvero senza disegnare effettivamente sullo schermo i due orologi, ma scrivendo semplicemente dei messaggi testuali che contengono l'ora.
Realizzare inoltre una classe di test per verificare il corretto funzionamento della soluzione implementata.

Seconda parte

Realizzare una seconda versione della soluzione utilizzando il meccanismo dei delegati ed eventi specifico del linguaggio C#.
Realizzare una terza versione della soluzione utilizzando gestori di eventi generici.
Realizzare una quarta versione impiegando un oggetto System.Timers.Timer come cuore della classe ClockTimer - anziché usare un thread - e proteggendo opportunamente le regioni critiche di tale classe per evitare l'accesso contemporaneo ai metodi GetTime()/SetTime e Start()/Stop() da parte di più thread.

Finalità dell'esercizio

Implementazione di un design pattern (Observer)
Uso dei thread
Uso dei delegati/eventi in C#
Delimitazione di regioni critiche thread-safe

Soluzione