jack06215

[tutorial] Observer pattern

Jul 17th, 2020 (edited)
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. class Subject
  6. {
  7.  
  8. public:
  9.     vector < class Observer* > views;
  10.     int value;
  11.  
  12.     void attach(Observer* obs)
  13.     {
  14.         views.push_back(obs);
  15.     }
  16.  
  17.     void detach_back()
  18.     {
  19.         views.pop_back();
  20.     }
  21.  
  22.     void setVal(int val)
  23.     {
  24.         value = val;
  25.         notify();
  26.     }
  27.     int getVal()
  28.     {
  29.         return value;
  30.     }
  31.     void notify();
  32.  
  33.  
  34. };
  35.  
  36. class Observer
  37. {
  38.  
  39.  
  40. public:
  41.     Observer(Subject* mod, int div)
  42.     {
  43.         model = mod;
  44.         denom = div;
  45.         model->attach(this);
  46.     }
  47.     virtual void update() = 0;
  48.  
  49.     Subject* model;
  50.     int denom;
  51.  
  52. protected:
  53.     Subject* getSubject()
  54.     {
  55.         return model;
  56.     }
  57.     int getDivisor()
  58.     {
  59.         return denom;
  60.     }
  61. };
  62.  
  63. void Subject::notify()
  64. {
  65.     // 5. Publisher broadcasts
  66.     for (int i = 0; i < views.size(); i++)
  67.         views[i]->update();
  68. }
  69.  
  70. class DivObserver : public Observer
  71. {
  72. public:
  73.     DivObserver(Subject* mod, int div) : Observer(mod, div) {}
  74.     void update()
  75.     {
  76.         // 6. "Pull" information of interest
  77.         int v = getSubject()->getVal(), d = getDivisor();
  78.         cout << v << " div " << d << " is " << v / d << '\n';
  79.     }
  80. };
  81.  
  82. class ModObserver : public Observer
  83. {
  84. public:
  85.     ModObserver(Subject* mod, int div) : Observer(mod, div) {}
  86.     void update()
  87.     {
  88.         int v = getSubject()->getVal(), d = getDivisor();
  89.         cout << v << " mod " << d << " is " << v % d << '\n';
  90.     }
  91. };
  92.  
  93. int main()
  94. {
  95.     Subject subj;
  96.     DivObserver divObs1(&subj, 4); // 7. Client configures the number and
  97.     DivObserver divObs2(&subj, 3); //    type of Observers
  98.     ModObserver modObs3(&subj, 3);
  99.     subj.setVal(14);
  100.  
  101.     subj.detach_back();
  102.     subj.setVal(15);
  103. }
Add Comment
Please, Sign In to add comment