본문 바로가기
C++/0x01-design pattern

Observer pattern

by SpeeDr00t 2016. 7. 14.
반응형

Observer pattern


1.소스

#include <iostream>
#include <vector>

using namespace std;

class Subject {

// 1. "independent" functionality
vector < class Observer * > views; // 3. Coupled only to "interface"
int value;
  
public:
    void attach(Observer *obs) {
        views.push_back(obs);
    }
    void setVal(int val) {
        value = val;
        notify();
    }
    int getVal() {
        return value;
    }
    void notify();
};


class Observer {

// 2. "dependent" functionality
Subject *model;
int denom;

public:
    Observer(Subject *mod, int div) {
        model = mod;
        denom = div;
        // 4. Observers register themselves with the Subject
        model->attach(this);
    }
    virtual void update() = 0;

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);
}
2.결과


hacker@HACKER:~/cpp$ g++ -o observer observer.cpp
hacker@HACKER:~/cpp$ ./observer
14 div 4 is 3
14 div 3 is 4
14 mod 3 is 2
반응형

'C++ > 0x01-design pattern' 카테고리의 다른 글

decorator pattern.  (0) 2016.07.14
composite pattern  (0) 2016.07.14
design pattern ][ Abstract Factory pattern  (0) 2016.07.14
state 패턴  (0) 2016.07.14
design pattern ][ SingleTon  (0) 2016.07.14