Я створив два абстрактних класи Subject і Observer, які визначають класичний інтерфейс шаблону Observer. Я отримую від них реалізацію схеми спостерігача. Спостерігач може виглядати так:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Це добре, і це говорить мені, хто щось змінив. Однак це не говорить мені, що змінилося. Іноді це нормально, тому що я просто збираюся запитувати Тему щодо останніх даних, але інший раз мені потрібно знати, що саме змінилося в Темі. Я зауважую, що в Java у них є метод notifyObservers () і метод notifyObservers (Object arg), щоб імовірно вказати деталі про те, що змінилося.
У моєму випадку мені потрібно знати, чи сталася одна з пари різних дій з цього питання, і, якщо це конкретна дія, знати ціле число, пов’язане з цією дією.
Отже, мої запитання:
- який спосіб C ++ передавати загальний аргумент (як це робить Java)?
- Чи спостерігач навіть найкращий зразок? Можливо, якась система заходів?
ОНОВЛЕННЯ
Я знайшов цю статтю, в якій йдеться про шаблони шаблону спостерігача: реалізація шаблону тема / спостерігача за допомогою шаблонів . Це змусило мене замислитися, чи можете ви викласти аргумент.
Я знайшов це запитання про переповнення стека, в якому йдеться про шаблону аргументу: Шаблон тематичного спостерігача на основі шаблону - чи слід використовувати static_cast або dynam_cast . Однак у ОП, здається, є проблема, на яку ніхто не відповів.
Інша річ, яку я можу зробити, - це змінити метод оновлення, щоб взяти об’єкт EventArg, як у:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
А потім створіть підкласи EventArg для конкретних даних аргументів, а потім я думаю, поверніть його до конкретного підкласу в методі оновлення.
ОНОВЛЕННЯ 2
Також знайдено статтю " Про створення асинхронної рамки c ++ на основі повідомлень; Частина 2, в якій обговорюється наявність Темою повідомлення про деталі про те, що змінилося.
Зараз я серйозно розглядаю можливість використання Boost.Signals . Використовувати мою власну схему спостерігача мало сенс, коли це було просто, але шаблонування типу та аргументу починає ускладнюватися. І мені може знадобитися безпека потоку Boost.Signals2.
ОНОВЛЕННЯ 3
Я також знайшов кілька цікавих статей про модель спостерігача:
Узагальнюючий спостерігач Герб Саттер
Реалізація шаблону спостерігача в C ++ - Частина 1
Досвід впровадження структури дизайну спостерігача (частина 2)
Досвід впровадження структури дизайну спостерігача (частина 3)
Однак я переключила свою реалізацію на використання Boost.Signals, який, хоча можливо, роздутий для моїх цілей, успішно працює. І, мабуть, будь-які побоювання з нальотом або швидкістю не мають значення.