Представление простой схемы двойной обработки событий:
Это круто. Более того, это работает. Однако я вижу здесь несколько проблем:
- EventHandlerInterface должен явно знать все события.
- В результате (1) обработчики могут иметь большие накладные расходы из-за подписки на неиспользуемые события.
То, что я хочу, чтобы эта структура была, выглядит примерно так:
Как видите, я хочу, чтобы отдельные типы событий создавались разными модулями, и я хочу, чтобы для каждого модуля были реализованы только необходимые интерфейсы обработки событий. Я не уверен, как связать это все вместе. В идеале я хотел бы иметь список EventServices, готовых принять любое событие.
Одна вещь, о которой я могу подумать здесь, - это иметь унаследованный EventService для каждого типа EventHandlerInterface и обработчиков пониженных событий для определенного типа внутри notify
метода. Однако он не является безопасным для типов и выглядит как отвратительная идея.
Второй подход, как я вижу, состоит в том, чтобы сделать EventService шаблоном и статически проверить аргумент шаблона как дочерний элемент EventHandlerInterface. Это было бы безопасно для типа и будет почти делать то, что я хочу. Однако таким образом я не могу хранить все EventServices в одном списке / векторе, как мне бы хотелось. Поэтому такой подход не является предпочтительным.
На самом деле мне кажется, что я смотрю не в ту сторону, но как найти правильную, я не знаю.
Спасибо!