观察者模式和发布订阅模式区别

观察者模式

发布者变化时会通知订阅者,换句话说,就是他们彼此耦合

 

 

发布订阅模式

发布者不会直接通知订阅者,换句话说他们彼此压根不认识,完全解耦

 

 

区别

 

伪代码

观察者模式

//观察者模式
//内部基于发布订阅,收集观察者,状态变化后通知

//被观察者
class Subject{
    constructor(name){
        this.name = name
        this.state = '开心'
        this.observers = []
    }
    attach(o){
        this.observers.push(o)
    }
    setState(newState){
        this.state = newState
        this.observers.forEach(o=>o.update(this))
    }
}
//观察者
class Observer{
    constructor(name){
        this.name = name
    }
    update(baby){
        console.log(`当前${this.name}被通知,小宝宝状态${baby.state}`)
    }
}
let baby = new Subject('宝宝')
let father = new Observer('爸爸')
let mother = new Observer('妈妈')

// 被观察者接受观察
baby.attach(father)
baby.attach(mother)
// 被观察者修改状态
baby.setState('不开心')
// 👇观察者被触发

// 当前爸爸被通知,小宝宝状态不开心
// 当前妈妈被通知,小宝宝状态不开心

 

发布订阅模式

let fs = require('fs')

//第三者Broker
let event = {
    _arr:[],
    on(fn){
        this._arr.push(fn)
    },
    emit(){
        this._arr.forEach(fn=>fn())
    }
}
//订阅
event.on(function(){
    console.log(Object.keys(person))

    if(Object.keys(person).length===3){
        console.log(person)
    }
})
let person = {}
fs.readFile('./name.txt','utf8',(err,data)=>{
    console.log(data)
    person.name = data
    //发布
    event.emit()
})
fs.readFile('./age.txt','utf8',(err,data)=>{
    person.age = data
    event.emit()
})
fs.readFile('./sex.txt','utf8',(err,data)=>{
    person.sex = data
    event.emit()
})

 

总结

角色不同:

观察者模式:发布者+观察者 2个角色

发布订阅模式:发布者+Broker+订阅者

使用不同:

观察者模式:通常用于单个应用内部

发布订阅模式:通常用于跨进程通信,列如:消息中间件

 

posted @ 2023-03-01 10:20  威少  阅读(42)  评论(0编辑  收藏  举报