События, двойная диспетчеризация и обработка абстрактных событий - PullRequest
0 голосов
/ 22 января 2019

Представление простой схемы двойной обработки событий:

enter image description here

Это круто. Более того, это работает. Однако я вижу здесь несколько проблем:

  1. EventHandlerInterface должен явно знать все события.
  2. В результате (1) обработчики могут иметь большие накладные расходы из-за подписки на неиспользуемые события.

То, что я хочу, чтобы эта структура была, выглядит примерно так:

enter image description here

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

Одна вещь, о которой я могу подумать здесь, - это иметь унаследованный EventService для каждого типа EventHandlerInterface и обработчиков пониженных событий для определенного типа внутри notify метода. Однако он не является безопасным для типов и выглядит как отвратительная идея.

Второй подход, как я вижу, состоит в том, чтобы сделать EventService шаблоном и статически проверить аргумент шаблона как дочерний элемент EventHandlerInterface. Это было бы безопасно для типа и будет почти делать то, что я хочу. Однако таким образом я не могу хранить все EventServices в одном списке / векторе, как мне бы хотелось. Поэтому такой подход не является предпочтительным.

На самом деле мне кажется, что я смотрю не в ту сторону, но как найти правильную, я не знаю.

Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Я не уверен, что шаблон посетителя - правильный подход к этой проблеме. Конечно, это дает вам механизм для двойной доставки, но это все, и, как вы сказали, у него есть недостатки, например, посетитель (EventHandlerInterface) должен обеспечить перегрузку для каждого другого типа хоста (EventInterface). Это создает тесную связь и имеет смысл, только если вы добавляете классы в иерархию хостов очень редко.

Почему бы не пойти на решение по шаблону publish-subscribe ? Это позволяет слабую связь и устраняет необходимость в избыточных интерфейсах. Вкратце, издатель предлагает несколько событий, на которые подписчики могут подписаться. Когда событие инициируется, подписчики уведомляются и обрабатывают его. Подписчики подписываются только на события, которые они считают актуальными. Разные подписчики могут по-разному обрабатывать события одного и того же типа, что, по-видимому, является целью двойной отправки в вашем случае.

Во многих языках (например, C #) существует специальный синтаксис для легкой поддержки этого шаблона. В C ++ вам нужно использовать такую ​​библиотеку, как boost, , хотя есть и другие. См. Также здесь для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...