一些网站上和一些书籍上说:发布订阅模式也叫观察者模式,意思是这两个模式是一样的,但是真的是这样吗 发布订阅模式和观察者模式有什么不同呢?
发布订阅模式属于广义上的观察者模式 发布订阅模式是最常用的一种观察者模式的实现,并且从解耦和重用角度来看,更优于典型的观察者模式
发布订阅模式多了个事件通道(event channel)
1.在观察者模式中,观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件并作出响应 观察者和被观察者,是松耦合的关系
2.在发布订阅模式中,发布者和订阅者之间多了一个发布通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件 发布和订阅完全独立,不存在耦合
下面我们直接上代码来看他们的区别
需求:数据打包下载功能(有新数据要提醒我们下载)
function DownloadTask (id) {
this.id = id
this.loaded = false
this.url = null
}
DownloadTask.prototype.finish = function (url) {
this.loaded = true
this.url = url
console.log(`Task ${this.id} load data from ${this.url}`)
}
function DataHub () {
this.downloadTasks = []
}
DataHub.prototype.addDownloadTask = function (downloadTask) {
this.downloadTasks.push(downloadTask)
}
DataHub.prototype.removeDownloadTask = function (downloadTask) {
this.downloadTasks = this.downloadTasks.filter(i => i !== downloadTask)
}
DataHub.prototype.notify = function (url) {
const downloadTaskCount = this.downloadTasks.length
for (let i = 0; i < downloadTaskCount; i++) {
this.downloadTasks[i].finish(url)
}
}
var dataHub = new DataHub()