观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。
一种一对多的关系中一称为被观察者也叫目标对象Subject
而多则称为观察者对象Observer
观察者模式中通常有两个模型,一个观察者(observer)和一个被观察者(Observed)。从字面意思上理解,即被观察者发生某些行为或者变化时,会通知观察者,观察者根据此行为或者变化做出处理。
特征:
Subject
,拥有方法:添加、删除、通知 Observer;Observer
,拥有方法:接收 Subject 状态变更通知并处理;Subject
状态变更时,通知所有 Observer
。如我们关注了某某订阅号,当订阅号有新的文章时,我们都收到了推文,这个就是最简单的观察者模式。
/*
定义:
观察者模式是一种对象行为模式。
它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
js 没有抽象类、接口 所以一般结构如下:
subject 目标 or 被观察者:
add: 把观察者注册进来
remove: 移除观察者
notify: 遍历注册进来的观察者,调用他们的update
Observer 观察者:
update: 自己提供的更新方法
*/
// 被观者、目标
class Subject {
constructor (data) {
this.observers = []
this.data = data
}
addObserver (data) {
this.observers.push(data)
}
removeObserver (data) {
this.observers = this.observers.filter(t => t !== data)
}
notify (...data) {
this.observers.forEach(observer => observer.update(...data))
}
// 你的业务代码
setData (data) {
this.data= data;
this.notify(data)
}
}
// 观察者
class Observer {
constructor (name) {
this.name = name
}
update (data) {
console.log(`${this.name}, 我执行了,${data}发生了变化`)
}
}
const sub = new Subject('我是被观察')
const ob1 = new Observer('我是ob1')
const ob2 = new Observer('我是ob2')
const ob3 = new Observer('我是ob3')
sub.addObserver(ob1)
sub.addObserver(ob2)
sub.addObserver(ob3)
sub.notify('现在开始发送第一个通知')
console.log('**************看看ob1 是不是没有收到第二个通知**************')
sub.removeObserver(ob1)
sub.notify('现在开始发送第二个通知')