Advertisement
Patasuss

C++ Observer

Jul 28th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4. #include <memory>
  5. #include <algorithm>
  6.  
  7. struct Event {
  8.     std::string message;
  9. };
  10.  
  11. class Observer {
  12. public:
  13.     Observer(int pNum) : num(pNum) {}
  14.    
  15.     void notify(Event& e) {
  16.         std::cout << "Observer #" << num << " received event: " << e.message << std::endl;
  17.     }
  18.    
  19.     int getNum() {return num;}
  20.        
  21. private:
  22.     int num;
  23. };
  24.  
  25. class Subject {
  26. public:
  27.     Subject(int pNum) : num(pNum) {}
  28.    
  29.     int getNum() {return num;}
  30.    
  31.     void addObserver(std::shared_ptr<Observer> pObserver) {
  32.         std::cout << "Added observer #" << pObserver->getNum() << " to observers of subject #" << num << std::endl;
  33.         observers.emplace_back(pObserver);
  34.     }
  35.    
  36.     void process(std::string pMessage) {
  37.         Event event{pMessage};
  38.         for(auto it=observers.begin(); it!=observers.end();) {
  39.             auto sharedObserver = (*it).lock();
  40.             if(sharedObserver) {
  41.                 sharedObserver->notify(event);
  42.                 ++it;
  43.             } else {
  44.                 std::cout << "Removed invalid observer" << std::endl;
  45.                 it = observers.erase(it);
  46.             }
  47.         }
  48.     }
  49.    
  50. private:
  51.     int num;
  52.     std::vector<std::weak_ptr<Observer>> observers;
  53. };
  54.  
  55. int main()
  56. {
  57.     Subject subject(1);
  58.     auto obs1 = std::make_shared<Observer>(1);
  59.     auto obs2 = std::make_shared<Observer>(2);
  60.     subject.addObserver(obs1);
  61.     subject.addObserver(obs2);
  62.     subject.process("Message 1");
  63.     obs2 = nullptr;
  64.     {
  65.         auto obs3 = std::make_shared<Observer>(3);
  66.         subject.addObserver(obs3);
  67.         subject.process("Message 2");
  68.     }
  69.     subject.process("Message 3");
  70.     subject.process("Message 4");
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement