博客
关于我
发布订阅模式与观察者模式
阅读量:511 次
发布时间:2019-03-07

本文共 1941 字,大约阅读时间需要 6 分钟。

设计模式是软件开发中的一项核心思想,它不仅仅是一种代码复用机制,更是一种解决问题的思维方式。在开发过程中,即使我们不自觉地运用了设计模式,也可能对其内涵却并不深入。就像搭乘车子时不会意识到车轮轮子的设计一样。在软件开发领域,已有24种被广泛认可的设计模式,每一种模式背后都蕴含着独特的解决方案。

让我们以观察者模式(Observer Pattern)为例。它描述了一种一种一对多的依赖关系:当一个对象发生改变时,所有依赖它的对象都会得到通知,从而更新自身状态。这种模式典型地采用直接订阅的方式实现,即观察者直接关联到目标对象。当目标对象发生变化时,会直接通知所有关注的观察者。

与观察者模式相对应的是发布订阅模式(Publish/Subscribe Pattern),它最初也被称为观察者模式的另一种实现形式。两者的主要区别在于实现方式:观察者模式中,对象和观察者是密耦合的关系,状态改变时会同步通知;而发布订阅模式则采用完全解耦的方式,通过中间机制完成事件的发布与订阅。这意味着在发布订阅模式中,发布者与订阅者之间不存在直接关联,所有的通信都通过中间代理完成,这种方式实现了异步通信。

以下是两个模式的简易代码示例:

观察者模式的实现:

function User(name, age) {  this.name = name;  this.age = age;  this.listeners = [];}User.prototype.subscribe = function (listener) {  this.listeners.push(listener);};User.prototype.publish = function (event) {  for (const listener of this.listeners) {    listener(event);  }};var user1 = new User('用户1', 18);var user2 = new User('用户2', 28);var user3 = new User('用户3', 38);user1.subscribe(user3);user2.subscribe(user3);user3.publish('用户状态改变');

发布订阅模式的实现:

var Bus = {  listeners: {}};Bus.subscribe = function (type, listener) {  if (!this.listeners[type]) {    this.listeners[type] = [];  }  this.listeners[type].push(listener);};Bus.publish = function (type, data) {  if (this.listeners[type]) {    for (const listener of this.listeners[type]) {      listener(data);    }  }};
function User(name) {  this.name = name;}User.prototype.publish = function (type /* , data */) {  Bus.publish(type, this);};User.prototype.subscribe = function (type) {  Bus.subscribe(type, this);};

公共类中的订阅与发布代码可以通过Bus进行中间处理。这种方式实现了解耦,用户与Bus是通过接口完成沟通。

在实际应用中,观察者模式和发布订阅模式的选择往往取决于具体的应用场景和需求。例如,在需要频繁修改对象状态并通知多个依赖对象时,观察者模式能够提供灵活且直接的解决方案;而在需要同时支持多个发布主题以及分类发布时,发布订阅模式则可以有效地实现解耦开发。

从代码实现来看,两种模式都遵循订阅者-发布者的设计思想,但关键在于它们的解耦程度。观察者模式属于松耦合设计,而发布订阅模式则属于更加强烈的解耦设计。这种解耦使得代码结构更加清晰,系统的扩展性更强。

通过实践,我们可以发现设计模式并不是成天想象出来的,而是解决具体问题的必然产物。在平时的开发中,即使我们不自觉地运用设计模式,也会不由得想着如何简化问题、寻找解决方案。正如一位资深开发者所说:"设计模式的魅力不仅在于它能提供现成的解决方案,更在于它培养了一种思考问题的方式。"这种方式能够帮助开发者在面对复杂挑战时,找到最优的解决方案。

转载地址:http://eennz.baihongyu.com/

你可能感兴趣的文章
Unable to execute dex: Multiple dex files
查看>>
Mac电脑调用自带的命令行窗口
查看>>
eclipse自动补全代码(Auto activation只能输3个字符)
查看>>
Java多线程
查看>>
Unity监听日记
查看>>
AndroidStudio跳到错误位置
查看>>
ARFoundation系列讲解-03申请苹果开发者账号
查看>>
木马开发的基本理论基础(五)
查看>>
openssl服务器证书操作
查看>>
expect 模拟交互 ftp 上传文件到指定目录下
查看>>
Matplotlib绘制分组聚合流程图
查看>>
Java 中的多态详解
查看>>
linux系统下双屏显示
查看>>
PDF.js —— vue项目中使用pdf.js显示pdf文件(流)
查看>>
我用wxPython搭建GUI量化系统之wx.Toolbar实现工具栏
查看>>
我用wxPython搭建GUI量化系统之wx.TextCtrl实现文本框
查看>>
我用wxPython搭建GUI量化系统之最小架构的运行
查看>>
我用wxPython搭建GUI量化系统之Sizer布局管理与页面切换
查看>>
我用wxPython搭建GUI量化系统之多只股票走势对比界面
查看>>
我用wxPython搭建GUI量化系统之财务选股工具添加日历和排序
查看>>