# 观察者模式
观察者模式指的是一个对象(Subject)
维持一系列依赖于它的对象(Observer)
,当有关状态发生变更时 Subject
对象则通知一系列 Observer
对象进行更新。
在观察者模式中,Subject
对象拥有添加、删除和通知一系列 Observer
的方法等等,而 Observer
对象拥有更新方法等等。
观察者模式属于一对多模式,让一系列观察者统一做某些事情
# 例子
下面是一个观察者例子, subject
假设为班里的老师,Observer
为班里的学生,他们观察着老师的命令.
老师的 add
可以添加被发号施令的对象,remove
移除被发号施令的对象,notify
通知被发号施令的对象去做一些事情。
// 统一观察主体,这里是老师
function Subject(){
this.observers = [];
}
Subject.prototype = {
add:function(observer){ // 添加
this.observers.push(observer);
},
remove:function(observer){ // 删除
var observers = this.observers;
for(var i = 0;i < observers.length;i++){
if(observers[i] === observer){
observers.splice(i,1);
}
}
},
notify:function(type){ // 通知
if (type === 'homework') {
var observers = this.observers;
for(var i = 0;i < observers.length;i++){
observers[i].handInHomework();
}
}
}
}
// 观察者,观察主体的命令,也是被发号施令者,根据接收的命令做一些事情,这里是学生
function Observer(name){
this.name = name;
}
Observer.prototype = {
handInHomework:function(){ // 更新
console.log(this.name + ' is handing in its homework');
}
}
var teacher = new Subject(); // 老师
// 小明小红又重现江湖,哈哈哈
var xiaoming = new Observer('xiaoming'); // 学生小明
var xiaohong = new Observer('xiaohong'); // 学生小红
teacher.add(xiaoming);
teacher.add(xiaohong);
teacher.notify('homework'); //xiaoming is handing in its homework , xiaohong is handing in its homework
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
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