Guest User

Untitled

a guest
Dec 25th, 2012
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <functional>
  4. #include <algorithm>
  5. #include <typeinfo>
  6.  
  7. class Event
  8. {
  9.   public:
  10.     int n;
  11.     static int serial;
  12.     Event() { n = serial++; }
  13.     virtual ~Event() {}
  14. };
  15.  
  16. int Event::serial = 0;
  17.  
  18. class Event1 : public Event {};
  19.  
  20. class Event2 : public Event {};
  21.  
  22. class Event11 : public Event1 {};
  23. class Event12 : public Event1 {};
  24.  
  25. class Event21 : public Event2 {};
  26. class Event22 : public Event2 {};
  27.  
  28. class EventHandlerBase
  29. {
  30.   public:
  31.     virtual void handleEvent(Event*) = 0;
  32.     virtual ~EventHandlerBase() {}
  33. };
  34.  
  35. template <class Ev>
  36. class EventHandler : public EventHandlerBase
  37. {
  38.     void handleEvent(Event* event)
  39.     {
  40.         Ev* derivedEvent = dynamic_cast<Ev*>(event);
  41.         if (derivedEvent)
  42.         {
  43.             handleEvent(derivedEvent);
  44.         }
  45.     }
  46.  
  47.     virtual void handleEvent(Ev*) = 0;
  48. };
  49.  
  50. class H1 : public EventHandler<Event1>
  51. {
  52.     void handleEvent(Event1* ev)
  53.     {
  54.         std::cout << "Event1 handled : " << typeid(*ev).name()
  55.           << "," << ev-> n << std::endl;
  56.     }
  57. };
  58.  
  59. class H12 : public EventHandler<Event12>
  60. {
  61.     void handleEvent(Event12* ev)
  62.     {
  63.         std::cout << "Event12 handled : " << typeid(*ev).name()
  64.           << "," << ev-> n << std::endl;
  65.     }
  66. };
  67.  
  68. class H21 : public EventHandler<Event21>
  69. {
  70.     void handleEvent(Event21* ev)
  71.     {
  72.         std::cout << "Event21 handled : " << typeid(*ev).name()
  73.           << "," << ev-> n << std::endl;
  74.     }
  75. };
  76.  
  77. class EventDispatcher
  78. {
  79.     std::list<EventHandlerBase*> handlers;
  80.   public:
  81.     void addHandler (EventHandlerBase* eh)
  82.     {
  83.         handlers.push_back(eh);
  84.     }
  85.     void dispatch (Event* ev)
  86.     {
  87.         std::for_each(handlers.begin(), handlers.end(),
  88.                       std::bind2nd(std::mem_fun(&EventHandlerBase::handleEvent), ev));
  89.     }
  90. };
  91.  
  92. int main ()
  93. {
  94.     EventDispatcher ed;
  95.  
  96.     ed.addHandler(new H1);
  97.     ed.addHandler(new H12);
  98.     ed.addHandler(new H21);
  99.  
  100.     std::cout << "go Event1 ---" << std::endl;
  101.     ed.dispatch(new Event1);
  102.     std::cout << "go Event11 ---" << std::endl;
  103.     ed.dispatch(new Event11);
  104.     std::cout << "go Event12 ---" << std::endl;
  105.     ed.dispatch(new Event12);
  106.     std::cout << "go Event21 ---" << std::endl;
  107.     ed.dispatch(new Event21);
  108.     std::cout << "go Event22 ---" << std::endl;
  109.     ed.dispatch(new Event22);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment