JS设计模式-发布订阅模式


JS设计模式-发布订阅模式

1.什么是发布订阅模式

"一对多的关系"

btn.addEventListener('click',fn1)
btn.addEventListener('click',fn2)
btn.addEventListener('click',fn3)

当初发点击事件时,上述绑定的三个函数都将执行

2.

var salesOffice = {}
salesOffice.clientList = {}
salesOffice.listen = function(type,fn){
    if(!this.clientList[type]) this.clientList[type] = []
    this.clientList[type].push(fn)
}
salesOffice.trriger = function(){
    var type = Array.prototype.shift.call(arguments)
    for(var i = 0; i

抽象解释一下

square88,square108:事件的类型

salesOffice.listen:用于绑定监听事件的函数

salesOffice.trriger:触发事件的函数

salesOffice.clientList:保存所有绑定事件的容器

3.封装

对下方的代码进行一个封装

var salesOffice = {}
salesOffice.clientList = {}
salesOffice.listen = function(type,fn){
    if(!this.clientList[type]) this.clientList[type] = []
    this.clientList[type].push(fn)
}
salesOffice.trriger = function(){
    var type = Array.prototype.shift.call(arguments)
    for(var i = 0; i

封装后

var Event = {
    clientList:{},
    listen:function(type,fn){
        if(!this.clientList[type]) this.clientList[type] = []
        this.clientList[type].push(fn)
    },
    trriger:function(){
        var type = Array.prototype.shift.call(arguments)
        for(var i = 0; i

通过installEvent即可使一个对象满足发布订阅模式的要求

4.面向对象封装

class Event{
    constructor(){
        this.clientList = {}
    }
    listen(type,fn) {
        if(!this.clientList[type]) this.clientList[type] = []
        this.clientList[type].push(fn)
    }
    trriger(){
        var type = Array.prototype.shift.call(arguments)
        for(var i = 0; i

对象继承