Mam problem z zaprojektowaniem pewnego systemu. I na tym etapie przychodzi mi do głowy tylko Sigleton, a wiem, że nie jest to zbyt dobre rozwiązanie i można to nazwać antywzorcem.
Potrzebuję klasę, która będzie, że tak powiem nadzorcą w całym systemie, będzie przechowywała stany udostępniane dla wszystkich innych obiektów, a jednocześnie będzie wykonywała operacje na danych otrzymywanych z innych podsystemów. Np. otrzymam z zewnętrznego systemu polecenie zmiany trybu pracy jakiegoś urządzania, albo zechcę je włączyć/wyłączyć. Odbiorę te dane w klasie odbierającej (wywołam jakąś metodę z klasy głównej Supervisor, np. sprawdzenie poprawności danych, czy się mieszczą
w odpowiednich zakresach, zmiane stanu w zależności od tego co przyjdzie.
Zakładam, że podsystemów będzie kilka. System sterujący temperaturą, system sterujący oświetleniem, system do sterowania jeszcze tam czegoś.
Komunikacja z systemem sterującym temperaturą będzie wyglądała w sposób nastepujący (dla innych analogicznie).
Przychodzi polecenie z systemu zewnętrznego po sieci aby ustawić temperaturę na 50 stopni. Mam klasę Supervisor jako tą główną (może istnieć tylko jedna jej instancja (no właśnie?) bo dane, które się w niej znajdują i metody które udostępnia muszą być wspólne i aktualne dla wszystkich innych podsystemów.
Mam Supervisor_Receiver, która odbiera mi dane z zewnątrz, jest takim łącznikiem z podsystemem, który może całością sterować.) Odbieram dane, (przekazuję je do Supervisor np. w celu sprawdzenia, jak temperatura będzie np. powyżej 45 stopni o ignoruję wiadomość całkowicie), jak mieści się w zakresie to wysyłam odpowiednie polecenie z wartością na jaki ma być ustawiona. Jak temperatura się zmieni to podsystem mi wysyła jakieś potwierdzenie OK czy coś, że wszystko gra.
No i jak to teraz przełożyć na kod?
Tworzę klasę Supervisor, czy ona powinna być statyczna?
Na samym początku klasa główna powinna zainicjować komunikację z innymi podsystemami. Zastanawiam się jak to rozwiązać. Czy utworzyć osobną klasę np. Connections zainicjować tam wszystkie połączenia, a następnie przekazać do klasy głównej referencję?