// ObserverControl.h: interface for the ObserverControl class. // ////////////////////////////////////////////////////////////////////// #ifndef __OBSERVERCONTROL_H__ #define __OBSERVERCONTROL_H__ #pragma once namespace util { template class ObserverControl { typedef std::list OBSERVER_LIST; private: template class Firer { public: explicit Firer1(T_result (T::*pMember)(T_arg), T_arg arg) : m_pMemFunc(pMember), m_arg(arg) {} T_result operator()(T *pClass) const { return ((pClass->*m_pMemFunc)(m_arg)); } private: T_result (T::*m_pMemFunc)(T_arg); T_arg m_arg; }; public: ObserverControl() {} ~ObserverControl() {} void RegisterObserver(T* pObserver) { listObserver_.push_back(pObserver); } void UnRegisterObserver(T* pObserver) { listObserver_.remove(pObserver); } OBSERVER_LIST& GetObservers() { return listObserver_; } template void _Fire(T_result (T::*pMember)(T_arg), T_arg arg) { std::for_each(listObserver_.begin(), listObserver_.end(), Firer(pMember, arg)); } protected: OBSERVER_LIST listObserver_; }; } // sample ////////////////////////////////////////////////////////////////////////// // // template // class IObserver // { // enum eEvent{ start }; // // void Register() { // WarEventControl::Instance()->RegisterObserver(this); // } // // void OnEvent(eEvent ObEvent) { // T* pObserver = static_cast(this); // return pObserver->OnEvent(ObEvent); // } // }; // // // class WarEventControl : public Singleton, public ObserverControl // { // void Fire() { // _Fire(&IObserver::OnEvent, IObserver::eEvent::start); // } // }; ////////////////////////////////////////////////////////////////////////// // // class GameDomination : public IObserver // { // void OnEvent(eEvent ObEvent) { // // process // } // }; #endif // __OBSERVERCONTROL_H__