发布-订阅模式

1.什么是发布订阅模式

发布订阅模式 又叫观察者模式,他是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变,所有依赖他的对象都将得到通知。

在javascript开发中,我们一般用事件模型来替代传统的发布-订阅模式。

2.Dom事件

实际上,只要我们曾经在dom节点上绑定过事件函数,那么我们就曾经使用过发布-订阅模式。

document.getElementById(‘test‘).addEventListener(‘click‘,function(){ alert(2)},fasle;)

在这里需要监控用户点击行为,但是我们没。法预知用户在什么时候点击。所以我们订阅document.body上的click事件,

当body被点击时,body便会像订阅者发布这个消息。

3.自定义事件。

一售楼部为例,购房者订阅售楼部消息,售楼部定时推送消息给购房者;

首先,要制定好谁当发布者;

然后,给发布者添加一个缓存列表,用于存放回掉函数以便通知订阅者

最后,发布消息的时候,发布者会遍历这个缓存列表,一次触发里面的订阅者回掉信息对各自进行处理;

var salesOffices = {}; //定义售楼处

salesOffices.clientList = [];//缓存列表,存放订阅者的回掉

salesOffices.listen = function(fn){ //增加订阅者,
  this.clientList.push(fn);//订阅的消息添加进缓存列表
}

salesOffices.trigger = function(){
  for (var i=0,fn;fn = this.clientList[i++];){
     fn.apply(this,arguments);//arguments 是发布消息时带上的参数
  }
}

//测试一下

salesOffices.listen(function(price,squareMeter){ //小明订阅
  console.log(‘价格‘+price);
  console.log(‘面积‘+squareMeter);
})

salesOffices.listen(function(price,squareMeter){ //小红订阅
  console.log(‘价格‘+price);
  console.log(‘面积‘+squareMeter);
})

salesOffices.trigger(2000000,88) //输出2000000 ,88平方
salesOffices.trigger(3000000,118) //300000,118平方

至此,我们已经实现了一个最简单的发布-订阅模式;但是还存在一些问题,。我们看到订阅者接受到了发布者的每个消息

虽然小明只想买88平的房子。但是发布者把118的房子也推送了,这是不必要的困扰,所以我们有必要增加一个表示key

r让订阅者之订阅自己喜欢的消息,改写后的代码如下;

var salesOffices = {}; //定义售楼处

salesOffices.clientList = [];//缓存列表,存放订阅者的回掉

salesOffices.listen = function(key,fn){ //增加订阅者,
    if(!this.clientList[key]){//如果还没有订阅过此类消息,给该类消息创//建一个缓存列表
    this.clientList[key] = [];
  }
  this.clientList[key].push(fn);//订阅的消息添加进缓存列表
}

salesOffices.trigger = function(){
  var key = Array.prototype.shift.call(arguments),//取出消息类型
        fns = this.clientList[key];

  if(!fns || fns.length === 0){ //如果没有订阅则返回
    return ;
  }
  for (var i=0,fn;fn = fns[i++];){
     fn.apply(this,arguments);//arguments 是发布消息时带上的参数
  }
}

//测试一下

salesOffices.listen(‘squerMeter88‘,function(price){ //小明订阅
  console.log(‘价格=‘+price);
  //console.log(‘面积‘+squareMeter);
})

salesOffices.listen(‘squareMeter100‘,function(price){ //小红订阅
  console.log(‘价格=‘+price);
 // console.log(‘面积‘+squareMeter);
})

salesOffices.trigger(‘squareMeter88‘,88) //输出2000000 ,88平方
salesOffices.trigger(‘squareMeter100‘,118) //300000,118平方 

现在订阅者可以只订阅自己感兴趣的事件了,但是,假设又去别的售楼部,那么这段代码是否又要在另一个地方重写一次呢,

有没有办法让所有的对象都拥有发布-订阅的功能呢?

显然是有的,javascript 是一门解释执行的语言,给对象动态添加职责是理所当然的事情;

所以我们把发布-订阅的功能提取出来放在一个单独的对象内;

var event = {

    clientList:[],

    listen:function(key,fn){
        if(!this.clientList[key]){

            this.clientList[key] = [];
        }
        this.clientList[key].push(fn);
    },

    trigger:function(){
       var key = Array.prototype.shift.call(arguments),
             fns = this.clientList[key];

       if(!fns|| fns.length === 0){
           return;
        }
         for(var i=0,fn;fns[i++]){
             fn.apply(this,arguments);
         }
    }

//在定义一个installEvent函数,这个函数可以所有对象都动态安装发布-订阅功能;

var installEvent = function(obj){
  for(var i in event){
     obj[i] = event[i];
   }
}

}        
时间: 2024-12-28 09:58:46

发布-订阅模式的相关文章

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

JavaScript设计模式与开发实践---读书笔记(8) 发布-订阅模式

发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案. 可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口. 自定义事件 首先要指定好谁充当发布者: 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者: 最后发布消息时,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数. 另外,我们还可以往回调函数里填入

观察者模式和发布/订阅模式的区别

在事件总线(EventBus)的架构设计中,用到了发布/订阅模式,但发现和观察者模式挺接近,有时容易发生混淆,现试图分清一下他们的关系. 观察者模式的角色为观察者(observer)和主题(subject)对象,observer需要观察subject时,需先到subject里面进行注册(subject对象持有observer对象的集合句柄),然后,当subject对象的内部状态发生变化时,把这个变化通知所有的观察者. 发布.订阅模式的角色为发布者(publisher)和订阅者(subscribe

发布订阅模式的理解

发布---订阅模式它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 发布订阅模式的优点: 支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象. 发布者与订阅者耦合性降低,发布者只管发布一条消息出去,它不关心这条消息如何被订阅者使用,同时,订阅者只监听发布者的事件名,只要发布者的事件名不变,它不管发布者如何改变: 对于第一点,我们日常工作中也经常使用到,比如我们的ajax请求,请求有成功(succes

4.js模式-发布-订阅模式

1. 发布-订阅模式 var observe = (function(){ var events = {}, listen, trigger, remmove; listen = function(key,fn){ if(!events[key]){ events[key] = []; } events[key].push(fn); }; trigger = function(){ var key = Array.prototype.shift.call(arguments); var fns

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

阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到顶部 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布-订阅模式: 比如小红最近在淘宝网上看上一双鞋子,但是呢 联系到卖家后,才发现这双鞋卖光了,但是小红对这双鞋又非常喜欢,所以呢联系卖家,问卖

ActiveMQ发布订阅模式

ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一个前提是都需要收到订单信息,那么我们就需要将一个生产者的消息发布到N个消费者. 生产者: try { //Create the Connection Factory IConnectionFactory factory = new ConnectionFactory("tcp://localhost

js 发布订阅模式

//发布订阅模式class EventEmiter{ constructor(){ //维护一个对象 this._events={ } } on(eventName,callback){ if( this._events[eventName]){ //如果有就放一个新的 this._events[eventName].push(callback); }else{ //如果没有就创建一个数组 this._events[eventName]=[callback] } } emit(eventName

redis 发布/订阅 模式

发布/订阅模式的命令如下: * 进入发布订阅模式的客户端,不能执行除发布订阅模式以上命令的其他命令,否则出错.