发布/订阅模式(即观察者模式): 设计该模式主要形成松散耦合。在这种模式中,并不是一个对象调用另一个对象的方法,而是一个订阅者对象订阅发布者对象的特定活动,并在发布者对象的状态发生改变后,订阅者对象获得通知。订阅者也称为观察者,而被观察的对象称为发布者。当发生了一个重要的事件时,发布者将会通知(调用)所有订阅者,并且可能经常以事件对象的形式传递消息。
基本思路:发布者对象需要一个数组类型的属性,以存储所有的订阅者。订阅(即注册)就是将新的订阅者加入到这个数组中去,而注销即是从这个数组中删除某个订阅者。此外,发布消息就是循环遍历订阅者列表并通知他们。
class Event{
constructor () {
// 事件名为属性,值为事件函数组成的数组
this.callback = {}
}
// 订阅事件
$on(name, fn) {
(this.callback[name] || (this.callback[name] = [])).push(fn)
}
// 发布事件
$emit(name, args) {
const cbs = this.callback[name]
if (cbs){
// 将该事件的事件数组循环调用
cbs.forEach(fn => {
fn.call(this, args)
})
}
}
// 注销
$off(name){
this.callback[name] = null
}
}
测试
const event = new Event()
event.$on('push', (name) => {
console.log('push', name);
})
event.$on('event', (name) => {
console.log('event', name);
})
event.$emit('push', '发布')
event.$emit('event', '事件')
event.$off('event')
event.$emit('event', '事件解除')