Система событий
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 61 из 61.
Задание
ЛегкоДавайте создадим Систему уведомлений — событийно-ориентированную архитектуру, в которой несколько обработчиков могут подписываться на событие и реагировать на него при его возникновении. Этот паттерн является основой реактивного программирования и графических интерфейсов (GUI).
Вы организуете свой код в трех файлах:
event.h: Определите тип указателя на функциюHandler, который принимает сообщениеconst char*. Создайте структуруEvent, которая содержит массив до 5 обработчиков и количество зарегистрированных обработчиков. Объявите функции для инициализации события, подписки обработчика и запуска события для уведомления всех подписчиков.event.c: Реализуйте вашу систему событий:init_event— принимает указатель на Event и устанавливает количество обработчиков в 0subscribe— принимает указатель на Event и Handler, добавляет обработчик в массив, если есть место (количество меньше 5), и увеличивает счетчикfire— принимает указатель на Event и строку сообщения, затем вызывает каждый зарегистрированный обработчик с этим сообщением в том порядке, в котором они были подписаны
main.c: Создайте три различные функции-обработчика, которые по-разному реагируют на события:logger— выводит[LOG], а затем сообщениеalert— выводит[ALERT], а затем сообщениеcounter— использует статическую переменную для подсчета количества вызовов, затем выводит[COUNT] X, где X — текущее значение счетчика
Ваша программа получит:
- Количество обработчиков для подписки (1, 2 или 3)
- Сообщение для рассылки
Пример вывода, когда входные данные 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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга