Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions 2025-2026/Week 15/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# OOП - Практикум 04.06.2026 - Седмица 15

Създайте система за контролиране на устройства в "умен дом". Системата управляра различни устройства(светлини, термостат, камера, ключалки), които могат да бъдат контролирани дистанционно. Системата трябва да поддържа действия при дадено събитие, както и макро команди(поредица от команди изпълнени като една). За целта създайте следните класове:

* ```Device``` - интерфейс за устройство, има методи ```turnOn()```, ```turnOff()```, ```getStatus()```, ```getID()```, ```getType()``` и наследници:
* ```Light```, има метод ```setBrightness(0-100)```;
* ```Thermostat```, има методи ```setTemperature(double)```, ```getTemperatrue()```;
* ```Camera```, има методи ```startRecording()```, ```stopRecording()```, ```motionDetected()```;
* ```DoorLock```, има методи ```lock()```, ```unlock()```, ```getBatteryLevel()```;

* ```DeviceFactory``` - клас със статичен метод ```createDevice(DeviceType, id)```, който хвърля грешка при невалидни аргументи;

* ```Command``` - интерфейс със ```execute``` метод и наследници ```TurnOnCommand```, ```TurnOffCommand```, ```SetTemperatureCommand```, ```StartRecordingCommand```.

* ```RemoteControl``` - пази списък от наредени тройки (команда, час на изпълнение, честота) напр. (изключи лампите, 19, once). Честотата може да бъде една от две стойности - once или daily. Списъкът трябва да е сортиран по часа на изпълнение. Класът трябва да има възможност за добавяне и премахване на команди, както и за изпълняване на следващата подред команда. Погрижете се командите отбелязани с daily да се изместват в края на списъка след като бъдат използвани.

* ```AlertListener``` - интерфейс с абстрактен метод ```onAlert(message)```
* класът камера уведомява слушателите, когато се засече движение(motionDetected метода)
* класът термостат иведомява всички слушатели, когато температурата прекоси даден праг
* имплементирайте ```Logger```, като конкретен наследник на ```AlertListener```, който
записва съобщенията от уведомленията във файл.

_Упътване_: Създайте клас ```Observable```, който пази списък от ```AlertListener```, и има възможност за добавяне/премахване на слушатели и метод за уведомяване на всички слушатели с дадено съобщение. ```Camera``` и ```Thermostat``` трябва да наследят ```Observable``` и да извикват метода за уведомяване с подходящо съобщение, при подходящи обстоятелства.

* ```MacroCommand``` - изпълнява списък от команди

* Предефинирайте следните оператори:
* ```<<``` за ```Device``` - извежда статуса на устройството
* ```==``` и ```!=``` за ```Device``` - сравнява само по id
* ```+``` за ```MacroCommand``` - връща нова команда, която изпълнява първо левия аргумент, после десния;