JavaScript-观察者模式(publish/subscribe)

JavaScript-观察者模式(publish/subscribe)

观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。

在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持。在JavaScript中事件监听机制就可以理解为一种观察者模式。

下面给出一个JS自定义的PubSub,仔细阅读下面这段代码有助于你理解观察者模式。相关代码请查看github

        function PubSub() {
          this.handlers = {};
        }
        PubSub.prototype = {
            // 订阅事件
            on: function(eventType, handler){
                var self = this;
                if(!(eventType in self.handlers)) {
                   self.handlers[eventType] = [];
                }
                self.handlers[eventType].push(handler);
                return this;
            },
             // 触发事件(发布事件)
            emit: function(eventType){
               var self = this;
               var handlerArgs = Array.prototype.slice.call(arguments,1);
               for(var i = 0; i < self.handlers[eventType].length; i++) {
                 self.handlers[eventType][i].apply(self,handlerArgs);
               }
               return self;
            },
            // 删除订阅事件
            off: function(eventType, handler){
                var currentEvent = this.handlers[eventType];
                var len = 0;
                if (currentEvent) {
                    len = currentEvent.length;
                    for (var i = len - 1; i >= 0; i--){
                        if (currentEvent[i] === handler){
                            currentEvent.splice(i, 1);
                        }
                    }
                }
                return this;
            }
        };

        var pubsub = new PubSub();
        var callback = function(data){
            console.log(data);
        };

        //订阅事件A
        pubsub.on(‘A‘, function(data){
            console.log(1 + data);
        });
        pubsub.on(‘A‘, function(data){
            console.log(2 + data);
        });
        pubsub.on(‘A‘, callback);

        //触发事件A
        pubsub.emit(‘A‘, ‘我是参数‘);

        //删除事件A的订阅源callback
        pubsub.off(‘A‘, callback);

        pubsub.emit(‘A‘, ‘我是第二次调用的参数‘);

运行结果。

时间: 2024-12-14 18:12:38

JavaScript-观察者模式(publish/subscribe)的相关文章

javascript设计模式——Publish/Subscribe

我们先引出问题的所在,这里使用一个订单系统: 在一个电子商务系统中,现在我们有订单模块,和信息模块两个主要模块,当下单成功时,我们用要发送订单信息的给客户. 下面是一个简单的解决办法,我们在一个类中调用另一个类的方法. // 订单类,存储订单的所有变量和函数 function Order( goods ){ this.goods = goods; } Order.prototype = { done: function(){ // 订单完成代码 this.sendSuccessMsg(); },

RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe)

原文:RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78628659 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 本节主要演示交换机的广播类型fanout,广播类型不需要routingKey,交换机会将所有

RabbitMQ - Publish/Subscribe in Java

这次我们试试publish / subscribe模式, 也就是将一个消息发送给多个consumer. 这里用一个简单的小程序来说明publish / subscribe. 由一个provider提供消息,这个消息会被多个consumer接收. consumer对同一个消息做出不同的反应,比如打印.保存到文件.数据库什么的. 之前的例子可能会给人这种感觉: producer将消息发送到队列中,消息缓冲在队列中,consumer从队列获得消息. 但这并不正确. 在rabbit中,producer从

RabbitMQ学习(三).NET Client之Publish/Subscribe

3 Publish/Subscribe Sending messages to many consumers at once Python | Java | Ruby | PHP| C# 转载请注明出处:jiq?钦's technical Blog Publish/Subscribe (using the .NET Client) 前面的教程我们已经学习了如何创建工作队列,工作队列背后的假设是每一个任务都被准确地递送给一个worker进行处理.这里我们将介绍完全不同的模式,即一个消息可以递送给多

RabbitMQ(三) -- Publish/Subscribe

RabbitMQ(三) -- Publish/Subscribe `rabbitmq`支持一对多的模式,一般称为发布/订阅.也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消费者. Exchanges 之前的教程中,仅仅使用了基本的消息模型: 生产者产生消息 把消息添加到消息队列 消费者接收消息 而在`rabbitmq完整的消息模型`中,并不是这样的.事实上,生产者并不知道消息是否发送到队列,而是把消息直接发送给`Exchanges`. `Exchanges`的功能理解

柯南君:看大数据时代下的IT架构(6)消息队列之RabbitMQ--案例(Publish/Subscribe起航)

一.回顾 让我们回顾一下,在上几章里都讲了什么?总结如下: <柯南君:看大数据时代下的IT架构(1)业界消息队列对比> <柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍> <柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装.配置与监控> <柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)> <柯南君:看大数据时代下的IT架构(5)消息队列之Rab

Mina、Netty、Twisted一起学(七):发布/订阅(Publish/Subscribe)

消息传递有很多种方式,请求/响应(Request/Reply)是最常用的.在前面的博文的例子中,很多都是采用请求/响应的方式,当服务器接收到消息后,会立即write回写一条消息到客户端.HTTP协议也是基于请求/响应的方式. 但是请求/响应并不能满足所有的消息传递的需求,有些需求可能需要服务端主动推送消息到客户端,而不是被动的等待请求后再给出响应. 发布/订阅(Publish/Subscribe)是一种服务器主动发送消息到客户端的消息传递方式.订阅者Subscriber连接到服务器客户端后,相当

publish/subscribe

Pub/Sub功能 Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件:发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者. Pub/Sub机制 1.       时间非耦合:发布者和订阅者不必同时在线,它们不必同时参与交互. 2.       空间非

Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】

python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bindings) (四).汇总(Putting it all together) python系列之 RabbitMQ -- Publish/Subscribe [发布和订阅] >>前面的部分我们创建了一个工作队列(work queue). 设想是每个任务都能分发到一个 worker[queue],这一