Самостійна робота.
Ці задачі розглядалися в темі №3 (делегати та події)
Їх можна розв’язати з використанням шаблону проєктування "спостерігач".
У кожній задачі тепер потрібно:
- визначити, який клас є спостережуваним об’єктом та реалізує інтерфейс
IObservable.
- У цьому класі потрібно реалізувати три методи, що визначені в цьому інтерфейсі:
- AddObserver() (для додавання спостерігача),
- RemoveObserver() (видалення спостерігача),
- NotifyObservers()
(сповіщення спостерігачів)
- У цьому ж класі визначити колекцію об’єктів-спостерігачів.
- Далі потрібно визначити, які класи є спостерігачами, та реалізувати в них інтерфейс IObserver
- У цих класах потрібно реалізувати метод Update(), який викликається спостережуваним об’єктом для
сповіщення спостерігача.
- У методі Main класу Program змоделювати задачу.
Варіанты задач
Варіант 1 – Залізничний переїзд
На залізничному переїзді є:
- шлагбаум
- автомобілі, які хочуть проїхати переїзд
- поїзд, який іноді проїжджає
Коли наближається поїзд:
- шлагбаум опускається
- автомобілі чекають
Коли поїзд проїхав:
- шлагбаум піднімається
- автомобілі їдуть
Шлагбаум та автомобілі — це спостерігачі. Поїзд — спостережуваний об'єкт.
Можлива модель
ВАРІАНТ 2
Проєкт «Двірцевий міст у Санкт-Петербурзі». Спроєктувати та реалізувати, використовуючи шаблони SINGLETON і OBSERVER
Класи: Car (автомобіль), Ship (корабель), Bridge (міст) і Program (тестуючий).
У класі Bridge описати два методи:
- TheBridgeIsDivorced. Міст розведено.
- BridgeFlattened. Міст зведено.
- Визначити метод ChangeBridge, який імітує зміну стану мосту. Після зміни стану виконується сповіщення всіх спостерігачів.
- Клас Car (автомобіль),
Поля:
- Марка автомобіля.
- Номер автомобіля.
Методи:
- TheBridgeIsDivorced: Виводить повідомлення: марка, номер, переїхав Двірцевий міст. Відписується від спостереження.
- BridgeFlattened: Виводить повідомлення: «Марка, номер, стою».
- Клас Ship (корабель)
Поля:
- Тип судна (круїзний лайнер, баржа, есмінець).
- Назва.
Методи:
- TheBarrierIsClosed: Виводить повідомлення: тип, назва, пройшов під Двірцевим мостом. Відписується від спостереження.
- Клас Bridge (міст)
- Застосувати шаблон Singleton до класу Bridge.
Методи:
- TheBridgeIsDivorced: Голубим кольором виводить повідомлення: Двірцевий міст розведено. Проїзд через Двірцевий міст заборонено.
- BridgeFlattened: Жовтим кольором виводить повідомлення: Відкрито проїзд через Двірцевий міст.
- ChangeBridge: Імітує зміну стану мосту.
ВАРІАНТ 3
Проєкт «Свободу папугам». Спроєктувати та реалізувати, використовуючи шаблони SINGLETON і OBSERVER
Об'єкт спостереження: Door (двері в будинку).
Спостерігачі: Dog (собака), Cat (кіт), Parrot (папуга).
І клас Program (тестувальник).
-
 |
Клас Door (Застосувати шаблон Singleton до класу Door). |
Методи:
Об'єкт ДВЕРІ може перебувати в трьох станах: "відчинені", "зачинені і тиша" та "зачинені і хтось стукає".
- ChangeDoor() — імітує зміну стану дверей. Після зміни стану виконується сповіщення всіх спостерігачів.
|
-
 |
Клас Dog (собака) |
Методи:
- Реакція на зачинені двері TukTuk(): Виводить повідомлення: "Гав, гав, гав. Не бійтеся, я не кусаю гостей."
- Реакція на зачинені двері Vois(): Виводить повідомлення: "Я собака, яка чекає гостей."
- Реакція на відчинені двері Door(): Виводить повідомлення: "Гав, гав, гав. Заходьте, двері відкриті." Відписується від спостереження.
|
-
 |
Клас Cat (кіт) |
Методи:
- Реакція на зачинені двері TukTuk(): Виводить повідомлення: "Мяу, мяу, мяу. Сподіваюся, ви не до мене прийшли?"
- Реакція на зачинені двері Vois(): Виводить повідомлення: "Мяу, мяу, мяу. Я кіт, який нікого не чекає."
- Реакція на відчинені двері Door(): Виводить повідомлення: "Мяу, мяу, мяу. Якщо вже приперлися — то принесли рибку?" Відписується від спостереження.
|
-
 |
Клас Parrot (папуга) |
Методи:
- Реакція на зачинені двері TukTuk(): Виводить повідомлення: "Свободу папугам!"
- Реакція на зачинені двері Vois(): Виводить повідомлення: "Сиджу за ґратами в клітці дурній..."
- Реакція на відчинені двері Door(): Виводить повідомлення: "Вилітаю на Гаїті!" Відписується від спостереження.
|
ВАРІАНТ 4
Проєкт «Метеорологічна станція». Спроєктувати та реалізувати, використовуючи шаблони SINGLETON і OBSERVER
Об'єкт спостереження MeteorologicalStation (Метеорологічна станція).
Спостерігачі: Airport (аеропорт),
TrainStation (залізничний вокзал), MarineStation (морський вокзал).
І клас Program (тестувальник).
-
 |
Клас MeteorologicalStation (Застосувати шаблон Singleton до класу MeteorologicalStation). |
Методи:
Об’єкт Датчики може перебувати в трьох станах: "rain", "storm" та "sunny" ("дощ", "шторм" і "сонячно").
- ChangeSensors(), який імітує зміну стану датчиків метеостанції. Після зміни стану відбувається сповіщення всіх спостерігачів.
|
-
 |
Клас Airport (аеропорт) |
Методи:
- Реакція на Rain(): Виводить повідомлення: "Дощ, рейс затримується".
- Реакція на Storm(): Виводить повідомлення: "Шторм. Рейс скасовується". Відписується від спостереження.
- Реакція на Sunny(): Виводить повідомлення: "Проходьте на посадку. Щасливого польоту".
|
-
 |
Клас TrainStation (залізничний вокзал) |
Методи:
- Реакція на Rain(): Виводить повідомлення: "Дощ, прибуття поїзда з запізненням на годину".
- Реакція на Storm(): Виводить повідомлення: "Шторм. Рейс відкладається до завершення шторму".
- Реакція на Sunny(): Виводить повідомлення: "Проходьте на посадку. Щасливої дороги".
|
-
 |
Клас MarineStation (морський вокзал) |
Методи:
- Реакція на Rain(): Виводить повідомлення: "Дощ, відпливаємо, заходьте в каюти".
- Реакція на Storm(): Виводить повідомлення: "Шторм. Рейс скасовується". Відписується від спостереження.
- Реакція на Sunny(): Виводить повідомлення: "Відпливаємо. Можете вийти на палуби. Щасливої дороги".
|
Завдання на паттерн "Спостерігач" для роботи в аудиторії
1. Система сповіщень погоди Легко
Розробіть систему, де метеостанція (Subject) сповіщає підписаних користувачів (Observers) про зміни погоди.
Вимоги:
- Метеостанція має методи для додавання/видалення спостерігачів
- При зміні погоди (температура, вологість, тиск) сповіщаються всі підписники
- Спостерігачі (наприклад, Мобільний додаток, Сайт, Радіо) реагують на зміни по-різному
Використайте інтерфейс IObserver з методом Update(weatherData). WeatherData містить температуру, вологість і тиск.
2. Система замовлень в кафе Середньо
Створіть систему, де кухня отримує сповіщення про нові замовлення.
Вимоги:
- Клієнт робить замовлення через систему (Subject)
- Кухня (Observer) отримує сповіщення про нове замовлення
- Бар (Observer) отримує тільки замовлення напоїв
- Система має підтримувати скасування замовлень
Розділіть замовлення на типи (їжа, напій). Бар підписується тільки на події типу "напій".
3. Біржа акцій Складно
Реалізуйте систему біржових сповіщень, де інвестори отримують інформацію про зміни цін.
Вимоги:
- Біржа (Subject) відстежує ціни акцій
- Інвестори (Observers) можуть підписатися на конкретні акції
- Сповіщення відправляються тільки при зміні ціни більше ніж на 5%
- Реалізуйте різні типи сповіщень (Email, SMS, Push)
Використайте Dictionary для зберігання підписок на конкретні акції. Фільтруйте події перед сповіщенням.
4. Система моніторингу серверів Середньо
Створіть систему моніторингу, яка сповіщає адміністраторів про проблеми.
Вимоги:
- Сервер (Subject) відстежує навантаження CPU, пам'яті
- Адміністратори (Observers) отримують сповіщення при перевищенні лімітів
- Різні рівні сповіщень (Warning, Error, Critical)
- Можливість налаштування порогових значень для кожного адміністратора
Додайте властивість Thresholds до класу адміністратора, яка визначає, за яких умов відправляти сповіщення.
5. Гра "Хіба що" (Battleship) Складно
Реалізуйте гру "Хіба що" з використанням паттерна Спостерігач.
Вимоги:
- Гральне поле (Subject) сповіщає гравців (Observers) про ходи
- Гравці отримують інформацію тільки про своє поле
- Система веде лог гри для адміністратора
- При потопленні корабля всі гравці отримують сповіщення
Використайте події "Хід гравця", "Влучання", "Промах", "Корабель потоплено". Адміністратор підписаний на всі події.
Назад
Вперед
Зміст