From 55f8116921cd1018e2b8b6282a22288400c5460c Mon Sep 17 00:00:00 2001 From: mumugrig Date: Thu, 4 Jun 2026 13:05:19 +0300 Subject: [PATCH] Week 15 Tasks --- 2025-2026/Week 15/Readme.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 2025-2026/Week 15/Readme.md diff --git a/2025-2026/Week 15/Readme.md b/2025-2026/Week 15/Readme.md new file mode 100644 index 0000000..ecc2aab --- /dev/null +++ b/2025-2026/Week 15/Readme.md @@ -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``` - връща нова команда, която изпълнява първо левия аргумент, после десния; + +