观察者模式概念
| 1、观察者模式又叫 发布-订阅 模式,其用来定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将通知其所有依赖关系 |
| |
| 2、观察者模式 具备两个角色,即 发布者 和 订阅者。 |
| |
| 3、正如我们工作中的产品经理就是一个 “ 发布者 ”,而前后端、测试可以理解为 “ 订阅者 ” |
| |
| 4、在 JavaScript 中,我们一般用 事件模型 来替代传统的 发布-订阅模式 |
| |
| 5、观察者模式 定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使它们能够自动更新自己,当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式。 |
观察者模式的运用
| 其实观察者模式对于前段来说应用很广,一个普通dom绑定一个事件其实也算观察者模式,区别就在于你能否在这模式核心基础上考虑到更多的东西,而不单单仅仅的发布监听。 |
| |
| Vue,React等等框架都大范围使用了这种设计模式,优点很明显 |
| |
| 1、一是时间解耦 |
| |
| 2、二是对象之间的解耦 |
| |
| 3、但是无论是啥模式都会有缺点,观察模式如果过度使用,会造成对象代码关联弱化,导致程序代码难以理解于跟踪维护 |
观察者模式的场景运用示例 Vue Event Bus
| import Vue from 'vue'; |
| |
| const EventBus = new Vue(); |
| Vue.prototype.$bus = EventBus; |
| |
| |
| this.$bus.$on('testEvent', func); |
| |
| this.$bus.$emit('testEvent', params); |
观察者模式的代码示例其一
| |
| class Publisher { |
| constructor () { |
| this.observers = []; |
| this.prdState = null; |
| } |
| |
| |
| add (observer) { |
| this.observers.push(observer); |
| } |
| |
| |
| notify () { |
| this.observers.forEach((observer) => { |
| observer.update(this); |
| }) |
| } |
| |
| |
| getState () { |
| return this.prdState; |
| } |
| |
| |
| setState (state) { |
| |
| this.prdState = state; |
| |
| this.notify(); |
| } |
| } |
| |
| |
| class Observer { |
| constructor () { |
| this.prdState = {}; |
| } |
| |
| update (publisher) { |
| |
| this.prdState = publisher.getState(); |
| |
| this.work(); |
| } |
| |
| |
| work () { |
| |
| const prd = this.prdState; |
| console.log(prd); |
| } |
| } |
| |
| |
| const wang = new Observer(); |
| |
| |
| const zhang = new Observer(); |
| |
| |
| const zeng = new Publisher(); |
| |
| |
| const prd = { |
| url: 'xxxxxxx' |
| }; |
| |
| |
| zeng.add(wang); |
| zeng.add(zhang); |
| |
| |
| zeng.setState(prd); |
观察者模式的代码示例其二
| |
| 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 s = new Subject() |
| let o1 = new Observer('o1', s) |
| let o2 = new Observer('02', s) |
| |
| s.setState(12) |
观察者模式总结其一
| 小结 |
| |
| 为解耦而生,为事件而生,符合开放封闭原则。 |
| |
| 使用场景 |
| |
| 跨层级通信、事件绑定 vue 响应式 等 |
观察者模式总结其二
| 优点 |
| |
| 1、支持简单的广播通信,自动通知所有已经订阅过的对象 |
| |
| 2、目标对象与观察者之间的抽象耦合关系能单独扩展以及重用 |
| |
| 3、增加了灵活性 |
| |
| 4、观察者模式 所做的工作就是在 解耦,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。 |
| |
| 缺点 |
| |
| 过度使用会导致对象与对象之间的联系弱化,会导致程序难以跟踪维护和理解 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南