00001 //---------------------------------------------------------------------------- 00004 // 00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved. 00006 //---------------------------------------------------------------------------- 00007 00008 #ifndef _cel_observable_h_ 00009 #define _cel_observable_h_ 00010 00011 #include "cel_types.h" 00012 #include "cel_referable.h" 00013 #include "cel_syncobjs.h" 00014 #include <vector> 00015 00016 namespace Celartem 00017 { 00018 class Observer; 00019 00026 class Observable : public Referable 00027 { 00028 public: 00033 virtual void notify(); 00034 00040 void attachObserver(Observer *inObserver); 00041 00047 void detachObserver(Observer *inObserver); 00048 00053 void detachAllObservers(); 00054 00055 protected: 00056 Observable(); 00057 virtual ~Observable(); 00058 00059 private: 00060 Mutex m_mutex; 00061 std::vector<Observer*> m_observers; 00062 typedef std::vector<Observer*>::iterator Iterator; 00063 00064 // duplication is not permitted 00065 Observable(const Observable&); 00066 Observable& operator=(const Observable&); 00067 }; 00068 00073 class Observer 00074 { 00075 public: 00079 virtual ~Observer() {} 00080 00088 virtual void update(Observable *inObservable) = 0; 00089 }; 00090 00096 class ObserverImpl : public Observer 00097 { 00098 public: 00102 ObserverImpl(); 00103 00107 virtual ~ObserverImpl(); 00108 00116 void attachObservable(Observable *inObservable); 00117 00125 void detachObservable(Observable *inObservable); 00126 00132 void detachAllObservables(); 00133 00141 virtual void update(Observable *inObservable) = 0; 00142 00143 private: 00144 Mutex m_mutex; 00145 std::vector<Observable *> m_observables; 00146 typedef std::vector<Observable *>::iterator Iterator; 00147 }; 00148 00149 } // namespace Celartem 00150 00151 #endif // _cel_observable_h_