Observer pattern
こんなのどう?
namespace Ravine { /** * Subject class */ template <class Host, class Param> class Subject { public: /** Observer class */ class Observer { public: virtual ~Observer() {} virtual void Notify(Param param) = 0; }; virtual ~Subject() {} virtual void NotifyObservers(Param pParam) { using namespace std; for_each(mObservers.begin(), mObservers.end(), bind2nd(mem_fun(&Observer::Notify), pParam)); } void RegisterObserver(Observer* pObserver) { mObservers.insert(pObserver); } void UnregisterObserver(Observer* pObserver) { mObservers.erase(pObserver); } private: std::set<Observer*> mObservers; }; } // namespace Ravine
まず Subject がありきだと思うので、Observer を Subject の innter class にしてある。なので Subject/Observer からの導出は以下のように行う。
struct NotifyInfo; // must class Contents : public Ravine::Subject<Contents, NotifyInfo*> { }; class ContentsListener : public Contents::Observer { public: virtual void Notify(NotifyInfo* pInfo) { ... } };
NotifyParam が必須なのが美しくない。