dynsxyc 2019-06-30
捡起大学所学的《设计模式》吧 Orz
观察者模式和发布订阅模式特别容易被人们混淆,很多书里面也将这两个概念混为一谈,所以首先要搞清楚这两种模式的区别。
╭─────────────╮ Fire Event ╭──────────────╮ │ │─────────────>│ │ │ Subject │ │ Observer │ │ │<─────────────│ │ ╰─────────────╯ Subscribe ╰──────────────╯
观察者其模式实很好理解,模式中只有两种角色,观察者和被观察者。
观察者模式属于行为型模式,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。
Subject(目标) 目标又称为主题,它是指被观察的对象。
Observer(观察者) 观察者将对观察目标的改变做出反应
代码例子:jQuery
function refresh() { $('div').empty().text('you are stupid.') $('div').trigger('refresh') } ... $('div').on('refresh', () => { $('span').empty().text('go to find it.') })
╭─────────────╮ ╭───────────────╮ Fire Event ╭──────────────╮ │ │ Publish Event │ │───────────────>│ │ │ Publisher │────────────────>│ Event Channel │ │ Subscriber │ │ │ │ │<───────────────│ │ ╰─────────────╯ ╰───────────────╯ Subscribe ╰──────────────╯
发布订阅模式属于广义上的观察者模式
发布订阅模式与观察者模式非常接近,仅仅只是多了一个中间层用于管理消息(信息通道),可以看成是一种优化的观察者模式。
生活中有一个很好的例子——广播电台,人们会把频道调到他们最喜欢的节目。广播站不知道观众听得是什么或者他们正在听什么,只需要发布他们的节目就可以了。而观众也不知道广播站制作节目的过程,他们只要在他们最喜欢的节目运行的时候把台调到对应的频道或者告知朋友就行。
两者的比较如下图所示:
观察者模式
发布订阅模式
参考链接