资讯专栏INFORMATION COLUMN

发布订阅模式

Richard_Gao / 2054人阅读

摘要:发布订阅模式又叫做观察者模式描述对象间的一对多依赖关系。我举几个常见例子以便理解报纸或杂志发布订阅编程中的事件模型手机流量超限制提醒等等使用场景应用于异步编程替代传统回调。优点是对象间达到松耦合缺点是当有多个发布者和订阅者嵌套时极难。

发布订阅模式,又叫做观察者模式,描述对象间的一对多依赖关系。我举几个常见例子以便理解:报纸或杂志发布订阅、js编程中的事件模型、手机流量超限制提醒等等

使用场景

应用于异步编程,替代传统回调。

   用它的好处是可以切换我们的关注点,关注点集中在订阅事件,而在异步回调中我们需要关注内部运行状态。

取代对象之间的硬编码机制,对象之间不必再显式调用。

   优点是对象间达到松耦合,缺点是当有多个发布者和订阅者嵌套时,极难debug。

实战例子: browser 中通过发布订阅模式实现事件机制,可直接执行
let EventP=(() => {
    let clientList={},  //订阅回调函数
        listen,  //监听器
        trigger,//触发器
        remove;
    listen= (key,fn) => {
        if(! clientList[key]){
            clientList[key]=[];
        }
       clientList[key].push(fn);
    };
    trigger= (...rest) => {
        let key=rest.shift(),
            fns=clientList[key];
        if(!fns||fns.length===0){
            return false;
        }
        fns.forEach(function (val,index) {
            val.apply(this,rest);
        });
    }
    remove=(key,fn) => {
        let fns=clientList[key];
        if(!fns){
            return false;
        }
        if(!fn){
            fns && (fns.length =0);
        }else{
            fns.forEach(function (val,index) {
                if(val==fn){
                    fns.splice(index,1);
                }
            });
        }
    };
    return{
        listen:listen,
        trigger:trigger,
        remove:remove,
    }
})();

EventP.listen("console",(info) => {
    console.log(info);
})


EventP.trigger("console","hello gcy");  //hello gcy
node当中已内置实现,下面是应用案例
let util= require("util");
let events = require("events");
function PC() {
    events.EventEmitter.call(this);
}
// util.inherits  //封装了es5的Object.create
util.inherits(PC,events.EventEmitter);


//equivalent  writing
// function PC() {
//     events.EventEmitter.call(this);
//     for(let tmpName in Event.EventEmitter.prototype){
//         this[tmpName]=Event.EventEmitter.prototype[tmpName];
//     }
// }

let pcInstance=new PC();
/**
 * keyInput 可以添加多个listeners
 */
pcInstance.on("keyInput",(track) => {
    console.log("track input",track);
});
let inputEnd=() => {
    console.log("input End");
}
pcInstance.on("keyInput",inputEnd);

/**
 *移除监听,必须有引用
 */
// pcInstance.removeListener("keyInput",inputEnd);

pcInstance.emit("keyInput","hello world gcy");

// ----------------------------------------------------------------------
// 对象组织事件名称,以便维护,模块复用
// let e={
//     keyInput:"keyInput",
//     charge:"charge"
//         ........
// }

//

说明 在node中我认为event的出现是为了解决异步问题(一般是事件驱动型)。event的本质是观察者模式的realize。它是base class之一

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82077.html

相关文章

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

    摘要:或许以前认为订阅发布模式是观察者模式的一种别称,但是发展至今,概念已经有了不少区别。参考文章订阅发布模式和观察者模式真的不一样 首选我们需要先了解两者的定义和实现的方式,才能更好的区分两者的不同点。 或许以前认为订阅发布模式是观察者模式的一种别称,但是发展至今,概念已经有了不少区别。 订阅发布模式 在软件架构中,发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特...

    ysl_unh 评论0 收藏0
  • JavaScript设计模式发布-订阅模式(观察者模式)-Part1

    摘要:设计模式与开发实践读书笔记。发布订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系。附设计模式之发布订阅模式观察者模式数据结构和算法系列栈队列优先队列循环队列设计模式系列设计模式之策略模式 《JavaScript设计模式与开发实践》读书笔记。 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖它的对象都将得到通知。 例...

    muzhuyu 评论0 收藏0
  • JavaScript 发布-订阅模式

    摘要:发布订阅模式订阅者把自己想订阅的事件注册到调度中心,当发布者发布该事件到调度中心,也就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码。 发布-订阅模式,看似陌生,其实不然。工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他们都使用了发布-订阅模式,让开发变得更加高效方便。 一...

    13651657101 评论0 收藏0
  • 设计模式之观察者模式发布订阅模式

    摘要:观察者模式与发布订阅的区别在模式中,知道,同时还保留了的记录。发布者订阅者在大多情况下是异步方式使用消息队列。图片源于网络侵权必删如果以结构来分辨模式,发布订阅模式相比观察者模式多了一个中间件订阅器,所以发布订阅模式是不同于观察者模式的。 学习了一段时间设计模式,当学到观察者模式和发布订阅模式的时候遇到了很大的问题,这两个模式有点类似,有点傻傻分不清楚,博客起因如此,开始对观察者和发布...

    BaronZhang 评论0 收藏0
  • 设计模式之观察者(发布/订阅模式

    摘要:发布订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系。事件观察者模式应该是最常用的模式之一。总之,当消息一发布,所有的订阅者都会收到消息。发布订阅模式还可以用来帮助实现一些别的设计模式,比如中介者模式。 发布/订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系。当一个对象的状态(发布者)发生改变时,所有依赖于它的对象都将得到通知。在 JavaScript 开发中,我们...

    dreamGong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<