forked from Lajule/patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Observer.h
69 lines (55 loc) · 1.43 KB
/
Observer.h
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
#ifndef OBSERVER_H
#define OBSERVER_H
#include <list>
#include <algorithm>
#include <functional>
namespace Patterns
{
// forward declaration
class Subject;
///////////////////////////////////////////////////////////////////////////
// class Observer
// Observer pattern.
// See:
// Design Patterns (Chapter 5. Behavioral Patterns)
///////////////////////////////////////////////////////////////////////////
class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject&) = 0;
};
namespace Private
{
// helper for Subject::Notify method
struct Update : public std::unary_function<Observer*, void>
{
Subject& _subject;
Update(Subject& subject) : _subject(subject) {}
void operator()(Observer* observer)
{ observer->Update(_subject); }
};
}
///////////////////////////////////////////////////////////////////////////
// class Subject
// The subject of Observer classes.
// See:
// Design Patterns (Chapter 5. Behavioral Patterns)
///////////////////////////////////////////////////////////////////////////
class Subject
{
public:
virtual ~Subject()
{ _list.clear(); }
void Attach(Observer& observer)
{ _list.push_back(&observer); }
void Detach(Observer& observer)
{ _list.remove(&observer); }
void Notify()
{ std::for_each(_list.begin(), _list.end(), Private::Update(*this)); }
protected:
typedef std::list<Observer*> ObserverList;
ObserverList _list;
};
}
#endif