美文网首页
JavaScript设计模式-0002--观察者模式

JavaScript设计模式-0002--观察者模式

作者: 八月飞花 | 来源:发表于2020-04-09 12:07 被阅读0次

    简介

    观察者模式是非常重要的模式,这个模式与“发布/订阅 模式”非常相似,
    因为机制是一旦被观察的数据发生了改变,就会通知注册此数据的所有接口
    ,将更新的消息发送出去。这个模式可以实现一对多 或 一对一 或 多对多
    本文暂时实现一对多的模式后续介绍多对多的模式
    

    应用场景

    -1-浏览器页面的所有的事件都是观察者模式实现的监听
    -2-es6的promise的。then也是一个发布订阅模式,当状态改变时,可以通过自定义函数执行相应的操作
    -3-nodejs的自定义事件也是一个观察者模式
    

    原理

    通过两个类之间加入观察者实现解耦,让用户的使用和观察者进行依赖,让主题和观察者进行依赖,主题
    和观察者的关系为多对多的关系,即一个主题可以对应一个观察者,一个观察者,可以对应多个主题,每个主题可都具有一个保存观察者的数组,每个观察者也可以具有保存多个主题的钩子
    

    UML时序图

    观察者模式时序图.png

    UML类图

    观察者模式类图.png

    原则

    主题和观察者分离,不是主动触发,而是被动监听,两者相互解耦,符合开放封闭原则
    

    实现

    实现主题

    class Subject{
       constructor(){
        this.data=0;
        this.observers=[];//初始化订阅者数组
      } 
      //获取数据
      getData(){ 
        return this.data;
      }
      //修改数据
      setData(data){
        this.data=data;
        this.notifyObserver();//触发通知函数
      }
      //订阅函数
      subScription(observer){
        this.observers.push(observer);
      }
      //通知绑定了此数据的所有观察者
      notifyOberserver(){
        this.observers.forEach(item=>{
          item.uodata();//调用对象的updata函数,实现通知
        });
      }
    }
    

    实现观察者

    class Obersver{
      constructor(name,subject){//观察的名称,和观察者对象
        this.name=name;
        this.subject=subject;
        this.subject.subScription(this);//添加观察者对象
      }
      //发布接收函数
      updata(){
        let data=this.subject.getData();
        console.log(this.name+"收到了"+data);
        return data;
      }
    }
    

    test

    const subject=new Suvject();
    const obersver1=new Oberser("观察者1",subject);
    const obersver2=new Oberser("观察者2",subject);
    const obersver3=new Oberser("观察者3",subject);
    //数据更新
    subject.setData(2000);
    

    结果为

    观察者1收到了2000
    观察者2收到了2000
    观察者3收到了2000
    

    相关文章

      网友评论

          本文标题:JavaScript设计模式-0002--观察者模式

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