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 が必須なのが美しくない。