本人是JavaScript开发者,以下的示例也是以Javascript举例来说明的。
一、概念
当对象间存在一对多的关系时,使用观察者模式。当被观察的对象发生变化时,其所有的观察者都会收到通知并进行相应的操作。
二、具体例子
比如说,学生小明情绪比较容易波动,所以当小明的情绪发生变化时,父母和老师希望及时获得通知,以便可以采取适当的措施来帮助他。
- 首先家长和老师都是「观察者」;
- 小明是「被观察者」;
- 家长和老师对小明的情绪状态很关注,就需要「订阅事件」;
- 当被观察者小明情绪发生变化的时候,他会通知所有注册过的观察者;
- 例如,如果小明感到很开心,他会告诉父母和老师:"我今天心情很好!";如果他感到沮丧,他也会告诉父母和老师:"我今天感觉不太好。"这个过程我们称之为「通知变化」;
三、代码实现
// 被观察者,学生
class Subject {
constructor() {
this.state = 'happy';
// 存储所有观察者
this.observers = [];
}
// 新增所有观察者
add(o){
this.observers.push(o)
}
//获取状态
getState() {
return this.state;
}
//更新状态并通知所有的观察者
setState(newStae) {
this.state = newStae;
this.notify()
}
//通知所有的观察者
notify() {
this.observers.forEach(o => o.update(this))
}
}
// 观察者 父母和老师
class Observer {
constructor(name) {
this.name = name;
}
update(student) {
console.log(`亲爱的${this.name},通知您当前学生的状态是:${student.getState()}`);
}
}
被观察者和观察者都用JS实现了,来看一下具体的应用:
// 被观察者
const student = new Subject()
// 观察者
const parent = new Observer('父母')
const teacher = new Observer('老师')
student.add(parent)
student.add(teacher)
student.setState('Sad')
来看一下控制台打印出来的:
以上就是一个简单的观察者模式。