#if !defined ATS_OBSERVER_H #define ATS_OBSERVER_H #include #include /********************************************************************* * Obseverパターン * **********************************************************************/ namespace ats { // オブサーバー(被通知側) --------------------------------------------------- template class Observer { public: Observer() {}; virtual ~Observer() {}; virtual void Update(T&) = 0; }; // サブジェクト(通知側) ----------------------------------------------------- template class Subject { private: std::list *> m_obs; public: Subject () {}; virtual ~Subject () {}; virtual void Attach (Observer* obs); virtual void Detach (Observer* obs); virtual void Notify(T&); //get_state(); }; // implementation ----------------------------------------------------------------------- // 登録 ------------------------------------------------------------------- template void Subject::Attach(Observer* obs) { m_obs.push_back(obs); } // 登録抹消 --------------------------------------------------------------- template void Subject::Detach (Observer* obs) { using namespace std; list*>::iterator i; // 見つからなければend()を返す。 i = find(m_obs.begin(), m_obs.end(), obs); // よって、end()でなければeraseを実行。 if (m_obs.end() != i) { m_obs.erase(i); } } // アップデート ---------------------------------------------------------- template void Subject::Notify(T& send_block) { typedef std::list*>::iterator Obs_itr; for(Obs_itr i = m_obs.begin(); m_obs.end() != i; i++) (*i)->Update(send_block); } } #endif // #if !defined ATS_OBSERVER_H