-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathmain.cpp
More file actions
90 lines (71 loc) · 1.92 KB
/
Copy pathmain.cpp
File metadata and controls
90 lines (71 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <vector>
using namespace std;
class Subject;
class Observer {
public:
// Observer() { }
virtual ~Observer() = default;
virtual void update(int) = 0;
};
class Subject {
public:
// Subject() { }
virtual ~Subject() = default;
virtual void attach(Observer *) = 0;
virtual void detach(Observer *) = 0;
virtual void notify() = 0;
};
class ConcreteObserver : public Observer {
public:
ConcreteObserver(Subject *sub) : m_pSubject(sub) { }
~ConcreteObserver() { cout << "ConcreteObserver deconstruct" << endl; }
void update(int val) override {
cout << "get update, new state: " << val << endl;
}
private:
Subject *m_pSubject;
};
class ConcreteSubject : public Subject {
public:
// ConcreteSubject() { }
// ~ConcreteSubject() { }
void attach(Observer * obsr) override { obsrVer.push_back(obsr); }
void detach(Observer * obsr) override {
// for(int i = 0; i < 5; ++i)
for (auto iter = obsrVer.begin(); iter != obsrVer.end(); ++iter) {
if (*iter == obsr) {
obsrVer.erase(iter);
break;
}
}
}
void notify() override {
for (auto obVar : obsrVer)
obVar->update(m_iState);
}
int getState() { return m_iState; }
void setState(int i) { m_iState = i; }
private:
vector<Observer*> obsrVer;
int m_iState;
};
int main(int argc, char *argv[])
{
ConcreteSubject *pSub = new ConcreteSubject();
Observer *pOb0 = new ConcreteObserver(pSub);
Observer *pOb1 = new ConcreteObserver(pSub);
pSub->attach(pOb0);
pSub->attach(pOb1);
pSub->setState(2);
pSub->notify();
pSub->detach(pOb0);
pSub->setState(3);
pSub->notify();
delete pOb0;
delete pOb1;
delete pSub;
return 0;
}
// http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html
// www.jellythink.com/archives/359