FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpp_tests/t103_observer_pattern.cpp at master · s-kramer/cpp_tests · GitHub
s-kramer
/
cpp_tests
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
0
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpp_tests
/
t103_observer_pattern.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
75 lines (69 loc) · 1.71 KB
Breadcrumbs
cpp_tests
/
t103_observer_pattern.cpp
Copy path
File metadata and controls
75 lines (69 loc) · 1.71 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
#
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
);
}
Back
|
FazBrowse Home
|
New Git URL