特点
1.发布/订阅的关系(但是它和发布订阅模式不是一样的,谨记)
2.一对N
//观察者模式js代码示例
//主题
class Subject {
constructor() {
this.state = 0
this.observers =[]
}
getState() {
return this.state
}
setState(state) {
this.state = state
this.notifyAllObservers()
}
notifyAllObservers() {
this.observers.forEach((observer) => {
observer.update()
})
}
attach(observer) {
this.observers.push(observer)
}
}
//观察者
class Observer {
constructor(name, subject) {
this.name = name
this.subject = subject
this.subject.attach(this)
}
update() {
console.log(this.name + 'update, state:' + this.subject.getState())
}
}
//测试
let subject = new Subject()
let o1 = new Observer('o1', subject)
let o2 = new Observer('o2', subject)
let o3 = new Observer('o3', subject)
subject.setState(1)
subject.setState(2)
subject.setState(3)
写到这里,我突然发现观察者模式代码有点耦合,俗称轻耦合,然后我很自觉的去百度了一下,怎么样实现完全解耦呢,百度告诉我答案,下面简单介绍一下:
观察者模式虽然有发布订阅这种类似的关系,但是和正在的发布订阅其实是不一样的,真正的发布订阅是完全解耦;意思是观察者模式有两个对象一个观察者一个被观察者,两个直接接触,但是真正的发布订阅其实还有个代理人,俗称Broker(经理人),举个比较庸俗的例子:
观察者模式就是男的出轨,两个女的直接对决,发布订阅就是男的在中间调解,哈哈,有点垃圾~