Skip to content

Commit 5b08abb

Browse files
committed
Classic Observer pattern was added.
1 parent 50f9b27 commit 5b08abb

File tree

1 file changed

+114
-0
lines changed
  • Behavioural/Observer/Classic/C++

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Adopted from http://www.cppblog.com/converse/archive/2006/08/05/10858.html
3+
*/
4+
5+
#include <iostream>
6+
#include <list>
7+
#include <algorithm>
8+
using namespace std;
9+
10+
typedef int STATE;
11+
12+
class Observer;
13+
14+
// Subject Interface (Observable)
15+
class Subject {
16+
public:
17+
Subject()
18+
:_subjectState( -1 ) {
19+
}
20+
21+
void notify();
22+
23+
void attach( Observer* observer ) {
24+
cout << "attach an Observer" << endl;
25+
_listObserver.push_back( observer );
26+
}
27+
28+
void detach( Observer* observer ) {
29+
list<Observer*>::iterator iter;
30+
iter = find( _listObserver.begin(), _listObserver.end(), observer );
31+
32+
if ( _listObserver.end() != iter ) {
33+
_listObserver.erase( iter );
34+
}
35+
cout << "detach and Observer" << endl;
36+
}
37+
38+
virtual void setState( STATE state ) {
39+
cout << "setState by subject" << endl;
40+
_subjectState = state;
41+
}
42+
43+
virtual STATE getState() {
44+
cout << "getState by subject" << endl;
45+
return _subjectState;
46+
}
47+
48+
protected:
49+
STATE _subjectState;
50+
list<Observer*> _listObserver;
51+
};
52+
53+
54+
55+
class Observer {
56+
public:
57+
virtual void update( Subject* subject ) = 0;
58+
protected:
59+
STATE _observerState;
60+
};
61+
62+
class ConcreteSubject : public Subject {
63+
public:
64+
virtual void setState( STATE state ) {
65+
cout << "setState by ConcreteSubject" << endl;
66+
_subjectState = state;
67+
}
68+
69+
virtual STATE getState() {
70+
cout << "getState by ConcreteSubject" << endl;
71+
return _subjectState;
72+
}
73+
};
74+
75+
class ConcreteObserver : public Observer {
76+
public:
77+
virtual void update( Subject* subject ) {
78+
if ( NULL == subject )
79+
return;
80+
_observerState = subject->getState();
81+
cout << "the ObserverState is " << _observerState << endl;
82+
}
83+
};
84+
85+
void Subject::notify() {
86+
cout << "notify observer's state" << endl;
87+
88+
list<Observer*>::iterator iter1, iter2;
89+
for ( iter1 = _listObserver.begin(), iter2 = _listObserver.end();
90+
iter1 != iter2;
91+
++iter1 ) {
92+
(*iter1)->update( this );
93+
}
94+
}
95+
96+
int main() {
97+
98+
Observer* observer1 = new ConcreteObserver();
99+
Observer* observer2 = new ConcreteObserver();
100+
101+
Subject* subject = new ConcreteSubject();
102+
103+
subject->attach( observer1 );
104+
subject->attach( observer2 );
105+
106+
subject->setState( 4 );
107+
subject->notify();
108+
109+
subject->detach( observer1 );
110+
subject->setState( 10 );
111+
subject->notify();
112+
113+
return 0;
114+
}

0 commit comments

Comments
 (0)