1. JavaScript实现的发布/订阅(Pub/Sub)模式
  2. 时间 2016-05-02 18:47:58  GiantMing's blog
  3. 原文  http://giantming.net/javascriptshi-xian-de-fa-bu-ding-yue-pub-sub-mo-shi/
  4. 主题 JavaScript 观察者模式
  5. 前段时间看了一下发布订阅者模式(也叫观察者模式),今天看<基于mvc的JavaScript的富应用开发>又看到了它,这个设计模式是非常有用的,正好写篇博客来分享一下.(标点符号我是不管的,别打我..)
  6.  
  7. 一些前端MVVM框架就是用的观察者模式实现是双向绑定
  8.  
  9. 先上维基百科看看:
  10.  
  11. 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。
  12.  
  13. <基于mvc的JavaScript的富应用开发>上给的解释:
  14.  
  15. 发布/订阅模式(Pub/Sub)是一种消息模式,它有 两个参与者 : : 发布者和订阅者 。发布者向 某个信道发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会 接收到一个通知。最重要的一点是, 发布者和订阅者是完全解耦的,彼此并不知晓对方 的存在。两者仅仅共享一个信道名称。
  16.  
  17. 理解起来很简单: 我去书报亭订了一份报纸,当他把报纸送给我了,我就去领了看.
  18.  
  19. 这里,我就变成了 订阅者 ,报亭就是 发布者 ,当报纸送到的时候(状态发生改变,通知订阅者),我就去领了看(做一些操作)
  20.  
  21. 废话说完了,我觉得我需要写一个,不然读者都以为我在吹牛,所以,装逼装到位,我就假装写一个吧(如有雷同纯属巧合)
  22.  
  23. 一个发布者应该有三个主要的方法: 订阅,发布,退订.
  24.  
  25. 先来写订阅:
  26.  
  27. var PubSub = {};  
  28. var eventObj = {};  
  29. PubSub.subscribe = function(event, fn) {  
  30.      eventObj[event] = fn;
  31. }
  32. 再来写个发布:
  33.  
  34. PubSub.publish = function(event) {  
  35.     if (eventObj[event]) eventObj[event]();
  36. }
  37. 最后写一个退订:
  38.  
  39. PubSub.off = function(event, fn) {  
  40.     if (eventObj[event]) eventObj[event] = null;
  41. }
  42. 我们来整理一下代码用闭包隐藏eventObj这个对象:
  43.  
  44. var PubSub = (function() {  
  45.     var eventObj = {};
  46.     return {
  47.         subscribe: function(event, fn) {
  48.             eventObj[event] = fn;
  49.         },
  50.         publish: function(event) {
  51.             if (eventObj[event]) eventObj[event]();
  52.         },
  53.         off: function(event) {
  54.             if (eventObj[event]) delete eventObj[event];
  55.         }
  56.     }
  57. }());
  58. 用一下试试试能不能跑:
  59.  
  60. PubSub.subscribe('event', function() {  
  61.     console.log('event release');
  62. });
  63. PubSub.publish('event'); // 'event release'  
  64. OK it work!!
  65.  
  66. 这绝对是最简单无脑的观察者模式的实现了,你以为这就完了吗?
  67.  
  68. 这样..这个一个事件只能绑定一个操作,并且取消订阅把整个事件都删除掉了,这样就不是很好了,我们应该写一个支持一个事件绑定多个操作的,并且退订时是退订一个事件上的一个操作,而不是删除整个事件
  69.  
  70. 再来:
  71.  
  72. 一个事件绑定多个操作,我们应该用一个数组把操作保存起来,发布时按订阅顺序执行,退订时删除对应的数组元素就好.
  73.  
  74. var PubSub = (function() {  
  75.     var queue = {};
  76.     var subscribe = function(event, fn) {
  77.         if (!queue[event]) queue[event] = [];
  78.         queue[event].push(fn);
  79.     }
  80.     var publish = function(event) {
  81.         var eventQueue = queue[event],
  82.             len = eventQueue.length;
  83.         if (eventQueue) {
  84.             eventQueue.forEach(function(item, index) {
  85.                 item();
  86.             });
  87.         }
  88.     }
  89.     var off = function(event, fn) {
  90.         var eventQueue = queue[event];
  91.         if (eventQueue) {
  92.             queue[event] = eventQueue.filter(function(item) {
  93.                 return item !== fn;
  94.             });
  95.         }
  96.     }
  97.     return {
  98.         subscribe: on,
  99.         publish: emit,
  100.         off: off
  101.     }
  102. }());
  103. 以上就是一个简单的观察者模式的实现了.
  104.  
  105. example:
  106.  
  107. function first() {  
  108.     console.log('event a publish first');
  109. }
  110. PubSub.subscribe('a', first);  
  111. PubSub.subscribe('a', function() {  
  112.     console.log('event a publish second');
  113. });
  114. PubSub.publish('a'); // event a emit first, event a emit second
  115.  
  116. PubSub.off('a', first);  
  117. PubSub.publish('a');  //event a emit second  
  118. 以上.

JavaScript实现的发布/订阅(Pub/Sub)模式的更多相关文章

  1. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  2. [转] Javascript中理解发布--订阅模式

    发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...

  3. [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  4. 【转】Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时 ...

  5. javascript中的发布订阅模式与观察者模式

    这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一. 设计模式的背景 设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学. 设计模式的定义是 ...

  6. JavaScript设计模式(发布订阅模式)

    发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...

  7. Javascript设计模式之发布-订阅模式

    简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...

  8. javascript 自定义事件 发布-订阅 模式 Event

    * javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...

  9. javaScript设计模式:发布订阅模式

    发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...

随机推荐

  1. 从后台看python--为什么说python是慢的

    python越来越作为一种科学技术研究的语言越来越流行,可是我们经常听到一个问题,python是慢的.那么我们从后台分析一下,为什么python是慢的. python是一种动态类型,解释型语言,它的值 ...

  2. 2019-8-14-win10-使用-SMB-v1

    title author date CreateTime categories win10 使用 SMB v1 lindexi 2019-08-14 08:55:55 +0800 2018-2-13 ...

  3. Linux 普通用户自动修改密码

    在大量服务器运维中,维护服务器账号就让人头痛,对账号密码策略要求,现写了一个shell脚本来完成账号密码的修改,当然这个不是最好的方法,只是在没有其它辅助服务时使用,最好还是使用账户统一管理服务来维护 ...

  4. CSS3 Animations

    CSS Animations 是CSS的一个模块,它定义了如何用关键帧来随时间推移对CSS属性的值进行动画处理.关键帧动画的行为可以通过指定它们的持续时间,它们的重复次数以及它们如何重复来控制. an ...

  5. mac上如何搜索文件?

    在Mac上如果你用会了搜索功能那绝对是个事半功倍的技巧.因为Mac本身有强大的文件索引能力, 可以帮你快速的找到你需要的文件.就好比我要找到上周修改过的word文档应该怎么办? * 使用语音命令让Si ...

  6. c++11 默认函数的控制

    1. 类与默认函数: C++中声明自定义的类,编译器会默认生成未定义的成员函数: 构造函数 拷贝构造函数 拷贝赋值函数(operator=) 移动构造函数 移动拷贝函数 析构函数 编译器还会提供全局默 ...

  7. MySQL跑得慢的原因分析

    第一点,硬件太老 硬件我们这里主要从CPU.内存.磁盘三个方面来说下,还有一些因素比如网卡,机房网络等因为文章篇幅关系,就不一一介绍了,以后还有机会可以聊. 首先我们来看下MySQL对CPU的利用特点 ...

  8. php substr_replace()函数 语法

    php substr_replace()函数 语法 作用:替换字符串中某串为另一个字符串大理石平台价格 语法:substr_replace(string,replacement,start,lengt ...

  9. Linux Crontab命令定时任务基本语法

    一.Crontab查看编辑重启 1.查看crontab定时执行任务列表 crontab -l 2.编辑crontab定时执行任务 crontab -e 3.删除crontab定时任务 crontab  ...

  10. Harbor修改暴露端口

    把原来的端口映射改成1180 一 修改docker-compose.yml [root@topcheer ~]# cat /mnt/harbor/docker-compose.yml version: ...