У меня есть один класс анимации. Мне нужно иметь некоторых наблюдателей за Play
, Pause
и Stop
событий в анимации. Я нашел 2 решения этой проблемы, но я не знаю, что выбрать.Как реализовать шаблон наблюдателя в C++
Использование подталкивания :: сигналы или что-то подобное и зарегистрировать функции обратного вызова для каждого события
Сделать простой интерфейс с 3-х чистыми виртуальными функциями (
OnPlay()
,OnPause()
,OnStop()
) и перейти к объектам анимации класса, которые реализовать этот интерфейс.
Есть преимущества и недостатки для каждого метода. Попробую перечислить те, которые я нашел до сих пор:
Преимущество для 1.
- Я могу использовать любую функцию-члена/свободную функцию обратного вызова
- у меня нет реализовать все 3 функции, если я не забочусь о них всех
- же объект может быть использован в качестве наблюдателя для нескольких анимация без прохождения дополнительных параметров из класса Animation
Недостатков для 1.
- Я должен создать вызываемый объект для каждого обратного вызова
- Если я хочу, чтобы добавить позже новое событие будет трудно найти места, где он был использован (компилятор не может заставить меня реализовать или проигнорировать новое событие).
- Как-то странный синтаксис (мне нужно использовать std :: bind/boost :: bind везде).
Преимущества 2.
- Легко понять конструкцию
- Если я добавить новое событие в классе интерфейса Анимация/Observer компилятор будет проводить в жизнь мне реализовать (пустой возможно) новая функция.
Недостатки для 2.
- Я должен реализовать (пусто возможно) 3 функции, даже если я буду использовать только один
- же объект не может быть использован в качестве наблюдателя для различных анимация без отправки некоторого дополнительного параметра из анимации (идентификатор или что-то еще).
- Невозможно использовать свободные функции.
Не могли бы вы посоветовать мне, что использовать? Из вашего опыта, что лучше для этой проблемы - свобода от первого априорного или понятного и понятного кода от второго?Можете ли вы дать мне другие преимущества/недостатки для обоих методов или другого решения?
В C++ 11 (который я предполагаю, что вы можете использовать, так как вы помечено вопрос с ним) лямбдах удалить большинство из «недостатков для 1" . –
Если использовать 'std :: bind' - это странный синтаксис для вас (особенно по сравнению с интерфейсами с виртуальными функциями' OnWhatever'), то вам следует скорее пересмотреть свой язык выбора. –
@ChristianRau Не для меня, но я не единственный, кто работает над кодовой базой. – Felics