观察者模式(2)--发布订阅模式
发布订阅模式和观察者模式的不同在于,增加了第三方即事件中心;目标对象状态的改变并直接通知观察者,而是通过第三方的事件中心来派发通知。
按照上一篇的观察者可以看着出来,当发布一个主题发布一个消息时,所有的观察者都能接收到,但现实的业务中 会存在按照一定的条件进行消息的推送,并不是所有的观察者都需要;
假如有这样一个 业务,是售楼部发布新房,根据买房者需求不同,进行相应的消息通知!
按照观察者进行编写 上代码
观察者
class Sub{ //售楼部 constructor(){ this.obList=[] //收集 买房者信息 } addOb(obSever){ //添加 this.obList.push(obSever) } // 通知每个观察者 并携带信息 notify(dataInfo){ this.obList.forEach(observer =>{ observer.upData(dataInfo) }) } } //买房者 class obServer{ constructor(name){ this.name=name } upData(data){ console.log(`买房 ${this.name}接收到${data}`); } } let sub= new Sub() let ob1=new obServer('张三') let ob2=new obServer('李四') sub.addOb(ob1) //售楼部添加 张三信息 sub.addOb(ob2) //售楼部添加 李四信息 sub.notify('100平的毛培房') //发布消息实现群体通知
实现发布订阅模式代码
class Sub { //售楼部 constructor(name, obServer) { this.name = name; this.obServer = obServer; } // 售楼部名称 addTopic(topicName) { this.obServer.addTopic(topicName); } // 推送房型 publish(topicName) { this.obServer.publish(topicName); } } //买房者 class obServer { constructor(name,obServer) { this.name = name this.obServer = obServer } subscribe(topicName) { this.obServer.subscribeTopic(topicName, this); } upData(data) { console.log(`买房 ${this.name}接收到${data}`); } } class SubServer { //事件中心 constructor() { this.topics = {}; } //添加售楼部房屋分类 addTopic(topicName) { this.topics[topicName] = []; } //买房者订阅 相应房屋分类 subscribeTopic(topicName, sub) { if (this.topics[topicName]) { this.topics[topicName].push(sub); } } //平台通知某个房屋分类下所有买房者 publish(topicName) { this.topics[topicName].forEach((item) => { item.upData(topicName); }); } } let SubS = new SubServer() //初始化事件中心 let sub = new Sub('1号售楼部', SubS) //绑定售楼部 sub.addTopic('88') //售楼部 提供相应的房型88平 sub.addTopic('100') //售楼部 提供相应的房型100平 let ob1 = new obServer('张三', SubS) // let ob2 = new obServer('李四', SubS) // ob1.subscribe("88"); //张三关注了88平 ob1.subscribe("100"); //张三关注了100平 ob2.subscribe("88"); //李四关注了88平 sub.publish('88') //售楼部推出88平房子 sub.publish('100') //售楼部推出100平房子
两种实现上很相似但又有所区别,发布订阅模式可能就更加灵活比较符合一些业务的实现;事件中心是将之前放在主题的部分逻辑进行解耦,在通过对象的形式实现的,定类推送消息不再是全部推送;
上叙都是模式的简单实现,里面还存在取消订阅,订阅全部....,可以根据实际的业务进行实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?