Существует множество различных механизмов для отслеживания изменений объекта.
Первая альтернатива - использовать действительно наблюдателей. Это подразумевает, что каждый метод, который изменяет данные в вашем объекте, вызывает наблюдателей. На практике лучше всего поместить это в одну функцию, например:
class MyClass
{
public:
void setValue(int value)
{
m_value = value;
notifyObservers();
}
private:
void notifyObservers()
{
for (auto it=m_observers.begin();it!=m_observers.end();++it)
(*it)->notify(this);
}
std::list<Observer *> m_observers;
};
Альтернативой является сохранение того, был ли объект изменен. Однако для этого необходимо определить значение слова «был изменен»; другими словами: когда я сбрасываю флаг «изменен».
Простое решение - использовать номер версии. Всякий раз, когда объект изменяется, вы увеличиваете номер версии, например:
class MyClass
{
public:
void setValue(int value)
{
m_value = value;
++m_version;
}
int getVersion() const
{
return m_version;
}
private:
int m_version;
};
Теперь другие классы могут просто запросить номер версии и использовать его, чтобы узнать, изменился ли он с момента последнего запроса номера версии.
Оба подхода имеют свои преимущества и недостатки:
- В механизме наблюдателей изменения могут быть медленными (так как вам нужно вызвать всех наблюдателей), но вы гарантированно, что все наблюдатели будут немедленно обновлены
- В подходе с номером версии изменения происходят очень быстро, но вы полагаетесь на другие классы, чтобы регулярно запрашивать изменения у вашего класса
Какой механизм является лучшим в вашем случае, зависит от ситуации. Если обнаружится, что на практике их лучше смешивать, в зависимости от ситуации. Некоторые изменения лучше всего распространять немедленно (например, в расчетах), другие изменения лучше всего откладывать (например, обновление экрана).