观察者模式
这个模式在我看来原理就是发布者身上放着一个电话本(list)存着订阅者的l联系方式(回调函数),在触发条件(发布)后就会依次联系(遍历调用list中的回调函数)订阅者
上代码:

function Hunter(name){this.name = namethis.list = []
}
// 发布消息方法
Hunter.prototype.publish = function(money){console.log(`${this.name}发布了任务,赏金为${money}`)this.list.forEach(item =>{item(money)})
}
//订阅,传入回调函数并存入到hunter的订阅数组中
Hunter.prototype.observe = function(fn,hunter){console.log(`${this.name}订阅了${hunter.name}`)hunter.list.push(fn)
}let xiaoming = new Hunter('小明');
let xiaohua = new Hunter('小花')
xiaohua.observe((money) => {console.log("小花接受了任务")if(money < 500){console.log(`并吐槽了一句:才${money}块`)}
},xiaoming)
xiaoming.publish(500)

发布订阅模式
我觉得发布订阅模式是观察者模式的升级版,还是存放多个联系方式,但是在有消息发布时只通知订阅了该消息的人。更像是猎人——猎人酒吧——猎人 的关系

let hunterBar = {  //定义一个猎人酒吧missions: {},//当有人订阅任务后missions的结构应为{//                                  tiger:[fn1,fn2,fn3]//                                  bear:[fn1,fn2]//                                }//酒吧提供订阅服务,订阅时得'填表'提供订阅人姓名、订阅的项目、有任务发布时的联系方式(回调函数)observe: function (name, mission, fn) {if (!this.missions[mission]) {this.missions[mission] = []}this.missions[mission].push(fn)console.log(`${name}订阅了有关${mission}的任务`)},//酒吧提供发布任务服务,发布时提供发布人的姓名、发布的任务、任务赏金publish: function (name, mission, money) {console.log(`${name}发布了关于${mission}的任务`)//如果没人订阅过相关任务就不给发布if (!this.missions[mission]) {return false}//有人订阅过相关任务就挨个联系他们(调回调函数)this.missions[mission].forEach(item => {item(mission, money)});}}
//定义猎人模板,只保存猎人的名字
function Hunter(name) {this.name = nameconsole.log(`猎人${name}诞生了`)    }
//定义猎人订阅行为
Hunter.prototype.observe = function (mission, fn) {//去酒吧订阅hunterBar.observe(this.name, mission, fn)
}
//定义猎人发布行为
Hunter.prototype.publish = function (mission, money) {//去酒吧发布hunterBar.publish(this.name, mission, money)
}let xiaoming = new Hunter('小明')
let xiaohua = new Hunter('小花')
let xiaoguang = new Hunter('小光')
xiaoming.observe('tiger', (mission, money) => {console.log(`小明接受了${mission}任务,并表示又可以赚${money}块钱了`)
})
xiaohua.observe('tiger', (mission, money) => {if(money < 1000){console.log('小花觉得钱太少了不想接这个任务')return false}console.log(`小花接受了${mission}任务,并表示又可以赚${money}块钱了`)
})
xiaoguang.publish('tiger', 500)

js设计模式之观察者模式和订阅发布模式相关推荐

  1. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  2. Publisher/Subscriber 订阅-发布模式原理解析

    Publisher/Subscriber 订阅-发布模式原理解析 参考资料 What Is Pub/Sub? Publish/Subscribe Messaging Explained 什么是serv ...

  3. 理解并实现 你自己的 订阅-发布模式

    订阅发布模式: 这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑.事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在.数据通过消息的方式可以灵活 ...

  4. RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入    假 ...

  5. JS设计模式之Module(模块)模式、Revealing Module(揭示模块)模式

    Module(模块)模式 概念 Module模式最初被定义为一种在传统软件工程中为类提供私有和共有封装的方法. 通过这种方式,能够使一个单独的对象拥有共有/私有方法和变量,从而屏蔽来自全局作用局的特殊 ...

  6. 4 交换机-fanout(订阅发布模式)

    目录 订阅发布模式 1.交换器(Exchange) 1.1.创建交换器 1.2 .推送消息到交换器 2.临时队列 3.绑定(bingdings) 5.代码例子 5.1.生产者代码示例 5.2.消费者代 ...

  7. js设计模式之观察者模式和发布/订阅模式

    观察者模式 The Observer is a design pattern where an object (known as a subject) maintains a list of obje ...

  8. 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式

    前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...

  9. 嵌入式消息订阅发布模式软件框架

    文章目录 一.总体框架 二.基于RT-Thread的SoftBus 2.1 SoftBus的由来 2.2 消息订阅者模式 2.3 静态订阅关系与动态订阅关系 2.4 C/S模式 2.5 消息订阅者模式 ...

最新文章

  1. 技术图文:字典技术在求解算法题中的应用
  2. 这就是芬兰:先让全国1%的人学起AI!
  3. 人工智能创业指南:AI 产品未来的发展模式及策略
  4. vue-router源码学习笔记
  5. 消息中间件—RabbitMQ(集群原理与搭建篇)
  6. delphi报列表索引越界怎么处理_Python入门第3课:列表元组,看这一篇够了 | 原创...
  7. /etc/services
  8. FreeBSD9.1安装Gnome2桌面
  9. 凡事预则立(Beta)
  10. python解密_Python解密
  11. hdu 3105 Fred's Lotto Tickets (水)
  12. cron和crontab_Linux crontab命令创建和管理Cron作业
  13. 计算机网络网络层之互联网控制报文协议(ICMP)
  14. 中国产品质量协会AAA等级企业限定为500家
  15. Atitti 跨语言异常的转换抛出 java js
  16. css参考-img标签
  17. c语言程序设计商品库存管理系统,《C语言课程设计商品库存管理系统》.doc
  18. 这种技术能够替代 Android 原生开发?
  19. Python正则表达式(网址正则/超链接正则)
  20. java长方体的父类_一个长方形类Rectangle,一个子类长方体类,计算周长,面积,体积...

热门文章

  1. ES6新增的数组方法
  2. C++序列化与反序列化的简单探索
  3. 专利#学习笔记# | 专 利基础 知 识
  4. idea p3c 自定义_IntelliJ IDEA 常用插件一览,让效率成为习惯
  5. cin c语言中文网,c++ cin详解
  6. db2 数据库-错误码大全
  7. 学python心得体会800字-python心得体会
  8. 《Linux性能优化实战》—倪朋飞,CPU部分学习笔记
  9. 有关初始化的一些问题
  10. vue后台管理、APP项目总结集合