forked from pkolt/design_patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
observer.js
77 lines (63 loc) · 2.24 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
75
76
77
/*
* Наблюдатель (Observer, Dependents, Publish-Subscribe) - паттерн поведения объектов.
*
* Определяет зависимость типа "один ко многим" между объектами таким образом,
* что при изменении состояния одного объекта все зависящие от него оповещаются об этом
* и автоматически обновляются.
*
* */
function Subject(){
/* Субъект */
this.data = null;
this.observers = [];
}
Subject.prototype.attach = function(observer){
/* подписаться на оповещение */
// проверим класс добавляемого объекта
if (!observer instanceof Observer){
throw Error('Неверный класс объекта');
}
for(var i = 0; i < this.observers.length; i++){
if(this.observers[i] === observer){
return;
}
}
this.observers.push(observer);
};
Subject.prototype.detach = function(observer){
/* отписаться от оповещения */
for(var i = 0; i < this.observers.length; i++){
if(this.observers[i] === observer){
this.observers.splice(i, 1);
return;
}
}
};
Subject.prototype.getData = function(){
return this.data;
};
Subject.prototype.setData = function(data){
this.data = data;
this.notify(data);
};
Subject.prototype.notify = function(data){
/* уведомить всех наблюдателей о событии */
for(var i = 0; i < this.observers.length; i++){
this.observers[i].update(data);
}
};
function Observer(name){
/* Наблюдатель */
this.name = name;
}
Observer.prototype.update = function(data){
console.log(this.name, ':', data);
};
var subject = new Subject(),
observer1 = new Observer('Наблюдатель 1'),
observer2 = new Observer('Наблюдатель 2');
subject.attach(observer1);
subject.attach(observer2);
subject.setData('данные для наблюдателя');
// Наблюдатель 1 : данные для наблюдателя
// Наблюдатель 2 : данные для наблюдателя