//: C09:Observable.h // From Thinking in C++, 2nd Edition // Available at http://www.BruceEckel.com // (c) Bruce Eckel 2000 // Copyright notice in Copyright.txt // The Observable class #ifndef OBSERVABLE_H #define OBSERVABLE_H #include "Observer.h" #include class Observable { bool changed; std::set observers; protected: virtual void setChanged() { changed = true; } virtual void clearChanged(){ changed = false; } public: virtual void addObserver(Observer& o) { observers.insert(&o); } virtual void deleteObserver(Observer& o) { observers.erase(&o); } virtual void deleteObservers() { observers.clear(); } virtual int countObservers() { return observers.size(); } virtual bool hasChanged() { return changed; } // If this object has changed, notify all // of its observers: virtual void notifyObservers(Argument* arg=0) { if(!hasChanged()) return; clearChanged(); // Not "changed" anymore std::set::iterator it; for(it = observers.begin(); it != observers.end(); it++) (*it)->update(this, arg); } }; #endif // OBSERVABLE_H ///:~