# 观察者模式

观察者模式指的是一个对象(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