00001 00015 #ifndef _TEMPLATES__OBSERVABLE_H_ 00016 #define _TEMPLATES__OBSERVABLE_H_ 00017 00018 #include <iterator> 00019 #include <algorithm> 00020 #include <deque> 00021 00022 #include "observer.h" 00023 00027 namespace Templates 00028 { 00029 template <class T> 00030 class Observable; 00031 } 00032 00055 template <class T> 00056 class Templates::Observable 00057 { 00058 private: 00059 00061 T *_self; 00062 00064 typedef std::deque<Observer<T> *> ObserverContainer; 00065 00067 ObserverContainer _observers; 00068 00069 public: 00075 Observable(T *self): _self(self), _observers() { } 00076 00080 virtual ~Observable() { } 00081 00087 void addObserver(Observer<T> *observer) 00088 { 00089 _observers.push_back(observer); 00090 } 00091 00097 void deleteObserver(Observer<T> *observer) 00098 { 00099 _observers.erase(std::remove_if(_observers.begin(), _observers.end(), 00100 std::bind2nd(std::equal_to<Observer<T> *>(), observer))); 00101 } 00102 00106 void cleanObservers() 00107 { 00108 _observers.clean(); 00109 } 00110 00116 void notifyObservers() 00117 { 00118 for (typename ObserverContainer::iterator iter = _observers.begin(); 00119 iter != _observers.end(); ++iter) { 00120 (*iter)->update(_self); 00121 } 00122 } 00123 }; 00124 00125 #endif