00001
00002 #ifndef SUBJECT_H
00003 #define SUBJECT_H
00004
00005 #include <list>
00006 #include "Observer.h"
00007 using namespace std;
00008
00016 class Subject {
00017 public:
00018 virtual ~Subject();
00019 virtual void attach(Observer *const);
00020 virtual void detach(Observer *const);
00021 virtual void detachAllObservers();
00022 virtual void notify() const;
00023 protected:
00024 Subject() {}
00025 private:
00026 std::list<Observer *> _observers;
00027 };
00028
00029
00030
00031
00032
00036 inline Subject::~Subject() {
00037 _observers.clear();
00038 }
00039
00043 inline void Subject::attach(Observer *const o) {
00044 _observers.push_back(o);
00045 }
00046
00050 inline void Subject::detach(Observer *const o) {
00051 _observers.remove(o);
00052 }
00053
00057 inline void Subject::detachAllObservers() {
00058 _observers.clear();
00059 }
00060
00064 inline void Subject::notify() const {
00065 for (std::list<Observer *>::const_iterator i = _observers.begin();
00066 i != _observers.end();
00067 ++i) {
00068 (*i)->update(this);
00069 }
00070 }
00071
00072 #endif