博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-发布订阅模式
阅读量:4086 次
发布时间:2019-05-25

本文共 1580 字,大约阅读时间需要 5 分钟。

这段时间在看vue的双向绑定原理,知道了vue的核心三大件:Observer, Complie, Watcher。

Observer用于监听属性的变化,如有变动就通知 Watcher。

Compile负责解析元素节点的指令,如v-if,v-bind之类, 进行数据和回调函数的绑定。

Watcher收到属性变动的通知,就触发对应属性的回调函数,更新视图。

在学习 Watcher 的实现时,发现用的是发布订阅模式,也称观察者模式。

其实我们从开始用 js/jQuery 监听事件开始,就已经在用发布订阅模式了。

例如 DOM 中的 addEventListener, jquery 的 on 绑定事件。

发布订阅模式,比较好理解。举几个例子:

电饭煲煮饭,电饭煲本身并不知道要在什么时候跳到保温,它就只能等通知,等到饭烧好了,电饭煲的某个控制器就发出一个通知, 喂喂喂,饭熟了,不要再煮了。OK,电饭煲的电源控制器收到通知了,好,我跳保温。

dianfanbao.addEvent('煮好了', function(){    jumpTo('保温');});复制代码

生活中的烧水啊,空调定时啊,你要买房子需要等开盘消息呀,都可以算是发布订阅模式吧。

发布订阅的核心思想就是维护一个对象,对象里面存放着各种事件的数组,根据不同的事件遍历不同的数组,执行回调。

一言不合上代码

class EventModel {    constructor() {        this.events = {};    }    on(eventType, fn) {        if (!this.events[eventType]) {            this.events[eventType] = [];        }        this.events[eventType].push(fn);    }    trigger(eventType, ...args) {        let eventCallbacks = this.events[eventType];        if (Array.isArray(eventCallbacks)) {            eventCallbacks.forEach( fn => fn.apply(this, args) );        }    }    off(eventType, fn) {        let eventCallbacks = this.events[eventType];        if ( !fn ) {            eventCallbacks.length = 0;        }        let idx = eventCallbacks.indexOf(fn);        if (idx !== -1) {            eventCallbacks.splice(idx, 1);        }    }}复制代码

测试

let event = new EventModel();let f = x => alert(x);event.on('click', f);event.trigger('click', 2);   //alert(2);event.off('click', f);复制代码

这周末比较忙,就先简单记录一下,争取早日搞懂双向绑定原理,分享出来给有需要的人。

作者:jkCaptain
链接:https://juejin.im/post/5b13601c6fb9a01e8a43278b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
1.随机函数,计算机运行的基石
查看>>
MouseEvent的e.stageX是Number型,可见as3作者的考虑
查看>>
在mc中直接加aswing组件,该组件还需最后用validate()方法
查看>>
移植Vim配色方案到Eclipse
查看>>
从超链接调用ActionScript
查看>>
谈谈加密和混淆吧[转]
查看>>
TCP的几个状态对于我们分析所起的作用SYN, FIN, ACK, PSH,
查看>>
网络游戏客户端的日志输出
查看>>
关于按钮的mouseOver和rollOver
查看>>
Netty框架
查看>>
Socket经验记录
查看>>
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
FMS 客户端带宽计算、带宽限制
查看>>
在线视频聊天(客服)系统开发那点事儿
查看>>
SecurityError Error 2148 SWF 不能访问本地资源
查看>>
Flex:自定义滚动条样式/隐藏上下箭头
查看>>
烈焰SWF解密
查看>>
Qt 静态编译后的exe太大, 可以这样压缩.
查看>>
3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇
查看>>
乘法逆元
查看>>