JS 设计模式八 -- 发布订阅者模式

概念

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

优点

1、支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象。

2、发布者与订阅者耦合性降低

缺点

创建订阅者需要消耗一定的时间和内存。

如果过度使用的话,反而使代码不好理解及代码不好维护。

代码实现

var Event = (function(){
    var list = {}, // 缓存订阅者列表
          listen,   // 订阅
          trigger,  // 发布订阅
          remove;   // 移除订阅
          listen = function(key,fn){
            if(!list[key]) {
                list[key] = [];
            }
            list[key].push(fn);
        };
        trigger = function(){
            var key = Array.prototype.shift.call(arguments),
                 fns = list[key];
            if(!fns || fns.length === 0) {
                return false;
            }
            for(var i = 0, fn; fn = fns[i++];) {
                fn.apply(this,arguments);
            }
        };
        remove = function(key,fn){
            var fns = list[key];
            if(!fns) {
                return false;
            }
            if(!fn) {
                fns && (fns.length = 0);
            }else {
                for(var i = fns.length - 1; i >= 0; i--){
                    var _fn = fns[i];
                    if(_fn === fn) {
                        fns.splice(i,1);
                    }
                }
            }
        };
        return {
            listen: listen,
            trigger: trigger,
            remove: remove
        }
})();
// 订阅:
Event.listen("color",function(size) {
    console.log("尺码为:"+size); // 打印出尺码为42
});

// 发布
Event.trigger("color",42);

原文地址:https://www.cnblogs.com/gaosirs/p/10756039.html

时间: 2024-10-18 13:29:53

JS 设计模式八 -- 发布订阅者模式的相关文章

JS 设计模式之发布-订阅

1.JS ES6 定义类,并包含两个方法:subscribe(订阅).publish(发布). class PubJs { constructor () { // 订阅名称列表 this.event_list = {}; } // 订阅 subscribe (eventName, callback) { } // 发布 publish (eventName, ...args) { } } 2.编写订阅者基础逻辑: 允许订阅者订阅信息: 如果当前订阅关键字已存在,则更新订阅回调,否则,新增关键字,

学习javascript设计模式之发布-订阅(观察者)模式

1.发布-订阅模式又叫观察者模式,它定义对象之间一种一对多的依赖关系. 2.如何实现发布-订阅模式 2-1.首先指定好发布者 2-2.给发布者添加一个缓冲列表,用户存放回调函数以便通知订阅者 2-3.最后发布消息时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数 例子: var salesOffice = {};salesOffice.clientList = [];salesOffice.listen = function(key,fn){    if(!this.clientL

设计模式 - 发布-订阅者模式

1.发布-订阅者 设计模式 定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知 观察者模式和发布订阅模式区别 观察者模式是由具体目标(发布者/被观察者)调度的,而发布/订阅模式是由独立的调度中心进行调度,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会:可以说发布订阅模式是观察者模式进一步解耦,在实际中被大量运用的一种模式 ** 观察者模式 ** 1.定义/解析 目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更

Vue发布-订阅者模式

1.vue响应原理: vue.js采用数据劫持结合发布-订阅者模式,通过Object.defineProperty()来劫持data中各个属性的setter.getter,在数据变动时,发布消息给订阅者,触发响应的监听回调. (setter和getter是对象的存储器属性,是一个函数,用来获取和设置值) 2.发布-订阅者模式的作用: 处理一对多的场景,应用于不同情况下的不同函数调用 优点:低耦合性,易于代码维护: 缺点:若订阅的消息未发生,需消耗一定的时间和内存. <!DOCTYPE html>

ActiveMQ发布-订阅消息模式

一.订阅杂志我们很多人都订过杂志,其过程很简单.只要告诉邮局我们所要订的杂志名.投递的地址,付了钱就OK.出版社定期会将出版的杂志交给邮局,邮局会根据订阅的列表,将杂志送达消费者手中.这样我们就可以看到每一期精彩的杂志了. 仔细思考一下订杂志的过程,我们会发现这样几个特点:1.消费者订杂志不需要直接找出版社:2.出版社只需要把杂志交给邮局:3.邮局将杂志送达消费者.邮局在整个过程中扮演了非常重要的中转作用,在出版社和消费者相互不需要知道对方的情况下,邮局完成了杂志的投递. 二. 发布-订阅消息模

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

简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过的事情.比如如下代码 document.body.addEventListener('click',function () { alert(2333); },false); document.body.click();//模拟点击事件 这里我们订阅了document.body的click事件,当bo

ActiveMQ的(点对点&amp;发布/订阅通信模式)和(持久化方式)

ActiveMQ的持久化 消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和ReliableMessaging结合起来应该是很好的保证了消息的可靠传送. 消息持久性的原理很简单,就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件.内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试.消

设计模式--观察者模式(发布/订阅模式)

观察者模式简单实现,在主题中需要存在一个观察者的集合,存在一个 update(),状态改变的时候遍历调用观察者集合中的对象,调用update()方法实现通知.而观察者需要做的就是重写 update() 实现自己的逻辑,然后订阅主题,接收状态的改变信息. 上面说到的观察者模式 会导致每一个观察者都需要实现同一个方法 update(),这在实际开发中是很难实现的,所以可以通过委托事件的方式 ,在主题的集合中 存放的是一个 event 对象.event 包含对象的信息,调用的方法名,用到的参数等信息.

JS设计模式(2)策略模式

什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. 如何解决:通过一个hash对象,来映射不同的策略. 优点: 1.算法可以自由切换. 2.避免使用多重条件判断. 3.扩展性.复用性良好. 缺点: 1.策略类会增多. 2.所有策略类都需要对外暴露. 使用场景: 1.需要动态地根据行为改变运行方法.2.为了减少代码,同时为了让代码具有更好的可读性.3