Наблюдатель, Observer — поведенческий шаблон проектирования. Также известен как «подчинённые» (Dependents), «издатель-подписчик» (Publisher-Subscriber).
НазначениеОпределяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.
При реализации шаблона «наблюдатель» обычно используются следующие классы.
Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей.
Observer — интерфейс, с помощью которого наблюдаемый объект оповещает наблюдателей.
ConcreteObservable — конкретный класс, который реализует интерфейс Observable.
ConcreteObserver — конкретный класс, который реализует интерфейс Observer.
Область примененияШаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:
существует, как минимум, один объект, рассылающий сообщения
имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.
Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.
#include <iostream>
#include <string>
#include <map>
#include <boost/foreach.hpp>
class SupervisedString;
class IObserver{
public:
virtual void handleEvent(const SupervisedString&) = 0;
};
class SupervisedString{ // Observable class
std::string _str;
std::map<IObserver* const, IObserver* const> _observers;
typedef std::map<IObserver* const, IObserver* const>::value_type item;
void _Notify(){
BOOST_FOREACH(item iter, _observers){
iter.second->handleEvent(*this);
}
}
public:
void add(IObserver& ref){_observers.insert(item(&ref, &ref));}
void remove(IObserver& ref){ _observers.erase(&ref);}
const std::string& get() const{return _str;}
void reset(std::string str){_str = str; _Notify();}
};
class Reflector: public IObserver{ // Prints the observed string into std::cout
public:
virtual void handleEvent(const SupervisedString& ref){
std::cout<<ref.get()<<std::endl;
}
};
class Counter: public IObserver{ // Prints the length of observed string into std::cout
virtual void handleEvent(const SupervisedString& ref){
std::cout<<"length = "<<ref.get().length()<<std::endl;
}
};
int main(){
SupervisedString str;
Reflector refl;
Counter cnt;
str.add(refl);
str.reset("Hello, World!");
std::cout<<std::endl;
str.remove(refl);
str.add (cnt);
str.reset("World, Hello!");
std::cout<<std::endl;
return 0;
}
Взято из википедии
http://ru.wikipedia.org/wiki/Observer_(модель)