00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef OBSERVER_HPP
00026 #define OBSERVER_HPP
00027
00028 #include <set>
00029
00030
00031 template <class S> class Observer;
00032
00033
00035 template <class S> class Subject
00036 {
00037 public:
00038 virtual ~Subject() {}
00039
00041 virtual void clearObservers()
00042 {
00043 m_observers.clear();
00044 }
00045
00048 virtual void addObserver( Observer<S>* pObserver )
00049 {
00050 m_observers.insert( pObserver );
00051 }
00052
00055 virtual void delObserver( Observer<S>* pObserver )
00056 {
00057 m_observers.erase( pObserver );
00058 }
00059
00061 virtual void notify()
00062 {
00063
00064 typename set<Observer<S>*>::const_iterator iter;
00065 for( iter = m_observers.begin(); iter != m_observers.end();
00066 iter++ )
00067 {
00068 if( *iter == NULL )
00069 {
00070 fprintf( stderr, "iter NULL !\n" );
00071 return;
00072 }
00073 (*iter)->onUpdate( *this );
00074 }
00075 }
00076
00077 protected:
00078 Subject() {}
00079
00080 private:
00082 set<Observer<S>*> m_observers;
00083 };
00084
00085
00087 template <class S> class Observer
00088 {
00089 public:
00090 virtual ~Observer() {}
00091
00093 virtual void onUpdate( Subject<S> &rSubject ) = 0;
00094
00095 protected:
00096 Observer() {}
00097 };
00098
00099
00100 #endif