Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- class Subject
- {
- public:
- vector < class Observer* > views;
- int value;
- void attach(Observer* obs)
- {
- views.push_back(obs);
- }
- void detach_back()
- {
- views.pop_back();
- }
- void setVal(int val)
- {
- value = val;
- notify();
- }
- int getVal()
- {
- return value;
- }
- void notify();
- };
- class Observer
- {
- public:
- Observer(Subject* mod, int div)
- {
- model = mod;
- denom = div;
- model->attach(this);
- }
- virtual void update() = 0;
- Subject* model;
- int denom;
- protected:
- Subject* getSubject()
- {
- return model;
- }
- int getDivisor()
- {
- return denom;
- }
- };
- void Subject::notify()
- {
- // 5. Publisher broadcasts
- for (int i = 0; i < views.size(); i++)
- views[i]->update();
- }
- class DivObserver : public Observer
- {
- public:
- DivObserver(Subject* mod, int div) : Observer(mod, div) {}
- void update()
- {
- // 6. "Pull" information of interest
- int v = getSubject()->getVal(), d = getDivisor();
- cout << v << " div " << d << " is " << v / d << '\n';
- }
- };
- class ModObserver : public Observer
- {
- public:
- ModObserver(Subject* mod, int div) : Observer(mod, div) {}
- void update()
- {
- int v = getSubject()->getVal(), d = getDivisor();
- cout << v << " mod " << d << " is " << v % d << '\n';
- }
- };
- int main()
- {
- Subject subj;
- DivObserver divObs1(&subj, 4); // 7. Client configures the number and
- DivObserver divObs2(&subj, 3); // type of Observers
- ModObserver modObs3(&subj, 3);
- subj.setVal(14);
- subj.detach_back();
- subj.setVal(15);
- }
Add Comment
Please, Sign In to add comment