标签

设计模式

设计模式(Design Pattern)是一种解决软件设计问题的经验总结和最佳实践,它们是针对常见问题和场景的通用解决方案。设计模式可以帮助开发人员更加灵活和高效地构建软件系统,提高代码的可重用性、可维护性和可扩展性。 常见的设计模式包括: 创建型模式:用于创建对象的模式,包括单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式等; 结构型模式:用于组织对象的模式,包括适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式等; 行为型模式:用于管理对象之间的交互和流程的模式,包括观察者模式、迭代器模式、模板方法模式、策略模式、命令模式、职责链模式、状态模式、访问者模式、备忘录模式、中介者模式等。 设计模式的优点在于它们是经过验证的最佳实践,可以帮助开发人员避免常见的设计错误和陷阱,提高代码的质量和可维护性。同时,设计模式也是一种共享的语言和思想,可以促进开发人员之间的沟通和合作。 然而,设计模式并不是一种万能的解决方案,它们应该根据具体的场景和需求进行选择和使用。在实际的开发中,开发人员应该深入了解各种设计模式的原理和应用场景,才能更加准确地使用它们来解决实际的问题。

设计模式
计算机基础2026年5月27日 00:59
发布订阅者模式和观察者模式的区别是什么?观察者模式是**主题直接通知观察者**,发布订阅模式是**通过消息代理中转**。这是两者最根本的区别。 打个比方:观察者模式像是你直接打电话通知朋友"我搬家了"——你得知道每个人的号码。发布订阅模式像是你在朋友圈发了一条动态——你不需要知道谁在看,想看的人自然会收到推送。 代码层面,观察者模式里 Subject 维护一个 Observer 列表,状态变化时逐个调用 observer.update()。发布订阅模式多了一层 EventBus,publisher.emit(event) 和 subscriber.on(event) 互相不知道对方存在。 ## 追问 ### 为什么说观察者模式是同步的,发布订阅是异步的? 不是绝对的,但典型实现确实如此。观察者模式里 Subject.notify() 直接遍历调用回调,默认同步执行。发布订阅的 EventBus 可以把回调放进微任务队列或 setTimeout,天然支持异步。不过你也可以让观察者异步回调,只是设计意图不同。 ### 实际项目中分别用在什么场景? - 观察者模式:Vue 的响应式系统(Dep → Watcher)、React 的 useState 通知、MobX 的 observer - 发布订阅:Vue 的 emit/on 事件总线、Node.js EventEmitter、Redis Pub/Sub、消息队列 ### 两者可以互相替代吗? 简单场景可以用观察者替代发布订阅——比如小项目里直接用 Vue 的 emit 就够。但跨组件、跨模块、甚至跨服务的通信,发布订阅的消息代理解耦优势会很明显。反过来,如果只是两个对象的联动,多加一层 EventBus 反而过度设计了。 ### 在面试中应该怎么回答这个区别? 先一句话说本质区别(是否经过中介),再用一个比喻让人秒懂,最后补充代码层面的差异(是否有 EventBus、是否知道对方存在)。加分项是举一个真实项目的例子,比如"我们在 XX 项目中用 EventEmitter 解耦了 A 模块和 B 模块的通信"。