美文网首页
js设计模式-观察者模式(3)

js设计模式-观察者模式(3)

作者: 疯狂吸猫 | 来源:发表于2019-11-22 11:21 被阅读0次

    基本观察者模式

    以下Observer为观察者,当state改变时通知观察者。addObserver进行订阅,this.observers中储存了所有的观察者。notify时对观察者进行通知。

    class Subject{
        constructor(){
            this.state="init"
            this.observers=[]
        }
    
        setState(state){//修改状态并通知观察者
            this.state=state
            this.notify(state)
        }
    
        notify(state){//通知
            this.observers.forEach(observer=>observer.getNewState(state))
        }
    
        addObserver(observer){//订阅
            this.observers.push(observer)
        }
    }
    class Observer{
        getNewState(state){
            console.log(`new state is: ${state}`)
        }
    }
    const sub=new Subject()
    const observer1=new Observer()
    const observer2=new Observer()
    sub.addObserver(observer1)//new state is: next state
    sub.addObserver(observer2)//new state is: next state
    sub.setState("next state")
    

    node中EventEmitter模块实现

    参考: 循序渐进教你实现一个完整的node的EventEmitter模块
    EventEmitter的使用方式:
    .on(type,function)设置监听事件的名称,.emit(type,args)触发事件,传递参数

    var events=require('events');
    var eventEmitter=new events.EventEmitter();
    eventEmitter.on('say',function(name){
        console.log('Hello',name);
    })
    eventEmitter.emit('say','Jony yu');
    

    EventEmitter的基本实现:handler储存所有的事件,key为事件名称。value为数组,数组中储存监听的function

    handler:{
      click:[],
    change:[]
    }
    
    class EventEmitter{
        constructor(){
            this.handler={}
        }
        on(type,fn){
            //第一次添加对应type-初始化
            !this.handler[type]&&(this.handler[type]=[])
            this.handler[type].push(fn)
        }
        emit(type,args){
            if(!this.handler[type])
            {
                console.log(`did not add listener : ${type}`)
                return null
            }else {
                this.handler[type].forEach(fn=>fn(args))
            }
    
        }
    }
    let event=new EventEmitter();
    event.on('say',function(str){
        console.log(str);
    });
    event.emit('say','hello Jony yu');
    

    相关文章

      网友评论

          本文标题:js设计模式-观察者模式(3)

          本文链接:https://www.haomeiwen.com/subject/hjyfwctx.html