Menu
Coddy logo textTech

Система событий

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 61 из 61.

challenge icon

Задание

Легко

Давайте создадим Систему уведомлений — событийно-ориентированную архитектуру, в которой несколько обработчиков могут подписываться на событие и реагировать на него при его возникновении. Этот паттерн является основой реактивного программирования и графических интерфейсов (GUI).

Вы организуете свой код в трех файлах:

  • event.h: Определите тип указателя на функцию Handler, который принимает сообщение const char*. Создайте структуру Event, которая содержит массив до 5 обработчиков и количество зарегистрированных обработчиков. Объявите функции для инициализации события, подписки обработчика и запуска события для уведомления всех подписчиков.
  • event.c: Реализуйте вашу систему событий:
    • init_event — принимает указатель на Event и устанавливает количество обработчиков в 0
    • subscribe — принимает указатель на Event и Handler, добавляет обработчик в массив, если есть место (количество меньше 5), и увеличивает счетчик
    • fire — принимает указатель на Event и строку сообщения, затем вызывает каждый зарегистрированный обработчик с этим сообщением в том порядке, в котором они были подписаны
  • main.c: Создайте три различные функции-обработчика, которые по-разному реагируют на события:
    • logger — выводит [LOG] , а затем сообщение
    • alert — выводит [ALERT] , а затем сообщение
    • counter — использует статическую переменную для подсчета количества вызовов, затем выводит [COUNT] X, где X — текущее значение счетчика
    Считайте целое число, указывающее, сколько обработчиков нужно подписать (1, 2 или 3). Подпишите указанное количество обработчиков по порядку: сначала logger, затем alert (если 2+), затем counter (если 3). Считайте строку сообщения, а затем запустите событие с этим сообщением.

Ваша программа получит:

  1. Количество обработчиков для подписки (1, 2 или 3)
  2. Сообщение для рассылки

Пример вывода, когда входные данные 3 и System started:

[LOG] System started
[ALERT] System started
[COUNT] 1

Пример вывода, когда входные данные 2 и Warning detected:

[LOG] Warning detected
[ALERT] Warning detected

Пример вывода, когда входные данные 1 и Hello:

[LOG] Hello

Это демонстрирует полиморфизм через указатели на функции — один и тот же вызов fire запускает совершенно разные действия в зависимости от того, какие обработчики подписаны. Каждый обработчик по-своему реагирует на одно и то же событие, демонстрируя слабосвязанную природу событийно-ориентированного проектирования.

Попробуйте сами

#include <stdio.h>
#include <string.h>
#include "event.h"

// TODO: Реализовать обработчик logger
// Выводит "[LOG] ", а затем сообщение
void logger(const char* message) {
    // TODO: Реализовать
}

// TODO: Реализовать обработчик alert
// Выводит "[ALERT] ", а затем сообщение
void alert(const char* message) {
    // TODO: Реализовать
}

// TODO: Реализовать обработчик counter
// Использует статическую переменную для подсчета вызовов
// Выводит "[COUNT] X", где X — текущее значение счетчика
void counter(const char* message) {
    // TODO: Реализовать со статической переменной
}

int main() {
    // Считать количество обработчиков для подписки
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // поглотить символ новой строки
    
    // Считать сообщение
    char message[256];
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0'; // удалить символ новой строки
    
    // TODO: Создать и инициализировать Event
    
    // TODO: Подписать обработчики на основе num_handlers
    // 1 обработчик: logger
    // 2 обработчика: logger, alert
    // 3 обработчика: logger, alert, counter
    
    // TODO: Вызвать событие с сообщением
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming