Как стать автором
Обновить

Использование подобия паттерна наблюдатель на С

Время на прочтение2 мин
Количество просмотров3K
Недавно вспоминал о том как читал книгу по паттернам проектирования для java и из-за того что я всё также не пойму как это делается по памяти в ооп, решил написать свою реализацию на си.

Я решил посмотреть ещё раз в этой книге по java как реализуется этот паттерн. Полистал всю главу, посмотрел код, но в голове ничего не отложилось. Почему так? ) Правильно ли мыслить в стиле ооп? Например я знаю немного java и c++, но насколько удобно можно сделать реализацию так, чтобы ей было приятно пользоваться и не забывалось? Также для эксперимента я посмотрел как это делается на c++. Ну честное слово, на такой код мне сложно смотреть, надо вчитываться в каждую строку и думать.

Так что же я сделал, что мне может пригодиться в будущем в программировании? Встречайте, реализация на github. Хочу объяснить простоту использования того что я написал. В этой реализации не нужно создавать структуру, которая будет хранить данные. Сама же основная структура находится за кулисами. Например я хочу подписаться в одном файле на издателя TRADE. Этот издатель например будет мне предоставлять скидки по товару. Я рассматриваю наблюдателя как обычную функцию и объявляю её согласно правилу.

void sub_trade ( void *event, void *data ) {
  /* здесь выводиться к примеру новые скидки на экран. */
}

Теперь я хочу создать издателя и подписаться на события. В данном случае ничего лишнего вызывать не нужно. Надо только указать к какому издателю передать подписчика.

enum { TRADE };
init_publisher ( TRADE, sub_trade, NULL );

И всё. мы подписались на издателя. Теперь в другом файле я например хочу сделать рассылку в онлайн чате. Я не знаю как удобно было бы это сделать в ооп, да тем более на java, но с помощью моей реализации это делается просто. Да кстати, на java наверное пришлось бы использовать статические методы.

Я объявляю ещё функцию подписчика.

enum { TRADE };
void notify_chat_trade ( void *event, void *data ) {
  /* здесь я рассылаю сообщения в чат */
}
...
init_publisher ( TRADE, notify_chat_trade, NULL );

Теперь в файле где происходит получение и парсинг новых данных, приходят данные о скидках. Мне всего лишь нужно вызвать такую функцию и данные передадутся куда надо.

/* для простоты я передал число 10, но конечно нужно отправлять специальные данные. */
send_event ( TRADE, 10 );

Вот так вот удобно и просто без сложностей использования можно получить нужный результат. Я думаю у меня хорошо получилось.

Кстати, кто может мне объяснить, это структурное программирование или процедурное?
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 16: ↑1 и ↓15-14
Комментарии30

Публикации

Истории

Работа

Программист С
45 вакансий

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург