javascript 简单的监听者模式

使用Map对象实现的一个简单的简单的监听者模式

对象

  • Subject 主题
    定义方法:

       add(){ //订阅
        ...
       } 
    
       remove(observe){ //取消订阅
        ...
       }
    
       notify(message){ //推送信息
        ...
       }
    
  • Observe 订阅者
    定义方法:

    update(message){  //信息处理
      ...
    }
/**

* 主题

*/

class Subject {

  constructor() {

    this.observes = new Map(); //订阅者对象集合

    this.messages = []; //推送的消息集合

  }

  // 订阅主题

  add(observe) {

    this.messages.forEach(message => {     

      observe.update(message);

    })

    this.observes.set(observe.id, observe);

  }

  //取消订阅

  remove(observe) {

    this.observes.has(observe.id) && this.observes.delete(observe.id);

  }

  //推送消息

  notify(value) {

    this.messages.push(value);

    this.observes.forEach(observe => {

      observe.update(value)

    })

  }

}

/**

* 订阅者

*/

class Observe {

  constructor(id) {

    this.id = id; // 实例对象唯一标识

  }

  update(message) {

    console.log("id: %s, value: %s", this.id, message)

  }

}

// 假设生成guid

function Guid() {

  function s4() {

    return Math.floor((1 + Math.random()) * 0x10000)

      .toString(16)

      .substring(1);

  }

  return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();

}

const subject = new Subject();

var o1 = new Observe(Guid()),

  o2 = new Observe(Guid()),

  o3 = new Observe(Guid()),

  o4 = new Observe(Guid());

subject.add(o1);

subject.add(o2);

subject.add(o3);

subject.notify("推送1");

subject.remove(o1);

subject.notify("[删除o1]: 推送2");

subject.remove(o2);

subject.notify("[删除o1、02]: 推送3");

subject.remove(o3);

subject.notify("[删除o1、02、03]: 推送4");

subject.add(o4); // 接收所有历史消息

//输出
id: e7766edc-f47d-d726-7ec6-456acf87dbb4, value: 推送1
id: 2d1c6763-8abf-e755-64ba-e87af7582f84, value: 推送1
id: 99d33283-6889-73af-da80-0f8c22a49983, value: 推送1
id: 2d1c6763-8abf-e755-64ba-e87af7582f84, value: [删除o1]: 推送2
id: 99d33283-6889-73af-da80-0f8c22a49983, value: [删除o1]: 推送2
id: 99d33283-6889-73af-da80-0f8c22a49983, value: [删除o1、02]: 推送3
id: b67a8969-0051-41bc-8c76-08b400d80a9e, value: 推送1
id: b67a8969-0051-41bc-8c76-08b400d80a9e, value: [删除o1]: 推送2
id: b67a8969-0051-41bc-8c76-08b400d80a9e, value: [删除o1、02]: 推送3
id: b67a8969-0051-41bc-8c76-08b400d80a9e, value: [删除o1、02、03]: 推送4

见笑了,各位
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • ❤当有问题,就一定有解决问题的办法。关键在于是不是要解决?一定要解决?天助自助者。自己不动,没人救得了。感谢肖总。...
    雅璇阅读 292评论 2 2