반응형
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 |