00001
00002
00003
00004
00005 #ifndef SubjectObserver_HH
00006 #define SubjectObserver_HH
00007 #include "Stiostream.h"
00008 #include <vector>
00009 using std::vector;
00010
00011 #include <algorithm>
00012 using std::for_each;
00013
00014 class Subject;
00015 class Observer;
00016
00017 class Subject
00018 {
00019 public:
00021 typedef vector<Observer*> ObserverVec;
00022
00023
00024 Subject();
00025 virtual ~Subject();
00026
00027
00028 virtual void attach(Observer*);
00029 virtual void detach(Observer*);
00030
00031
00032 virtual void notify();
00033
00034 protected:
00035 ObserverVec mObservers;
00036 };
00037
00038 class Observer
00039 {
00040 public:
00041
00042 Observer();
00043 Observer(Subject * subject);
00044 virtual ~Observer();
00045 virtual void getNewState()=0;
00046 virtual void changed(Subject* changedSubject);
00047 virtual void forgetSubject(Subject* theObsoleteSubject);
00048
00049 protected:
00050
00051 Subject* mSubject;
00052 };
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 inline void Observer::forgetSubject(Subject* obsolete)
00064 {
00065 if (obsolete==mSubject)
00066 mSubject=0;
00067 else
00068 cout <<"Observer::forgetSubject(Subject*) - ERROR - obsolete!=mSubject"<<endl;
00069 }
00070
00071 #endif