-
Notifications
You must be signed in to change notification settings - Fork 1
/
observer.js
74 lines (60 loc) · 1.55 KB
/
observer.js
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
/* Observer:
provides a update interface for each observable object
*/
const ObserverList = (() => {
let observersList = [];
const add = object => {
observersList.push(object);
};
const remove = object => {
const objectIndex = observersList.indexOf(object);
observersList.splice(objectIndex, 1);
};
const list = () => observersList;
return {
add,
remove,
list
};
})();
// Testing the ObserverList API
const obj1 = { name: "TK", age: 26 };
const obj2 = { name: "Kaio", age: 10 };
ObserverList.list(); // []
ObserverList.add(obj1);
ObserverList.list(); // [{ name: 'TK', age: 26 }]
ObserverList.add(obj2);
ObserverList.list(); // [{ name: 'TK', age: 26 }, { name: 'Kaio', age: 10 }]
ObserverList.remove(obj1);
ObserverList.list(); // [{ name: 'Kaio', age: 10 }]
/* Subject:
an object that maintains a list of observers
and notify each one if the state change.
It also facilitates adding and removing observers from the list
*/
const Subject = (() => {
let observers = ObserverList;
const addObserver = observer => observers.add(observer);
const removeObserver = observer => observers.remove(observer);
const notifyObservers = context => {
for (let observer of observers.list()) {
observer.update(context);
}
};
return {
addObserver,
removeObserver,
notifyObservers
};
})();
/* Observer:
provides a update interface for each observable object
*/
const Observer = (() => {
const update = context => {
// update the observer with the context
};
return {
update
};
})();