00001
00002
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef OBSERVER_H
00013 #define OBSERVER_H
00014
00015 #ifndef SWIG
00016 #if _MSC_VER > 1000
00017 #pragma once
00018 #endif // _MSC_VER > 1000
00019 #endif
00020
00021 #include <list>
00022
00023
00024 class Subject;
00025
00026
00027 class Observer
00028 {
00029 public:
00030 virtual ~Observer() {};
00031 virtual void Update(Subject *theChangedSubject) = 0;
00032
00033 protected:
00034 Observer()
00035 {
00036
00037
00038
00039
00040
00041
00042 }
00043 };
00044
00045 class Subject
00046 {
00047 public:
00048 virtual ~Subject()
00049 {
00050 delete _observers;
00051 }
00052 virtual void Attach(Observer* o)
00053 {
00054 _observers->push_back(o);
00055 }
00056 virtual void Detach(Observer* o)
00057 {
00058 _observers->remove(o);
00059 }
00060 virtual void Notify()
00061 {
00062 std::list<Observer*>::iterator i = _observers->begin();
00063 while (i != _observers->end())
00064 {
00065 (*i)->Update(this);
00066 i++;
00067 }
00068 }
00069
00070 protected:
00071 #ifndef SWIG // XXX SWIG doesn't support standard template libraries
00072 Subject()
00073 {
00074 _observers = new std::list<Observer*>;
00075 }
00076 #endif // SWIG
00077 private:
00078 #ifndef SWIG // XXX SWIG doesn't support standard template libraries
00079 std::list<Observer*> *_observers;
00080 #endif // SWIG
00081 };
00082
00083 #endif // !defined(OBSERVER_H)