本文介绍基于事件编程的基础思想,用JavaScript代码表达(伪代码,不可执行)。
想象一下这个场景,明天你跟你家妞约好出去玩,你很想知道明天的天气怎样,于是你就打电话去气象站问,但是你不知道气象站什么时候能出结果,于是你就隔段时间打个电话问问,不停的打,然后人家被你弄烦了,不理你了。 这样做多不好,多不nice啊,于是你改变方法,跟气象站这么说:“您好,我很想知道明天的天气,这是我的电话号码,如果天气预报结果出来后,麻烦给我个电话,谢谢!”。过了段时间,气象站的工作人员打电话告诉你,明儿个是个大晴天,于是你高高兴兴的和你家妞出去玩了。。。。(OK,YY结束,回来现实世界(苦逼的单身汉))。
将上面的场景抽象(你不断的打电话给别人)一下,用JavaScript表示的话,
var weatherStation = {
result: null
startWork: function() {
//处理收集的数据,计算中。。。
if (结果出来了) {
this.result = 结果
}
},
answer: function (question) {
return result;
}
};
var theBoy = {
getWeatherInfo: function () {
//隔一个小时打个电话
setTimeout(this.callWeatherStation, 3600000);
},
callWeatherStation : function() {
weatherStation.answer();
}
};
weatherStation.startWork();
theBoy. getWeatherInfo();
换种处事方式(说话客气点,让别人打电话给你),换种代码:
var weatherStation = {
result: null,
callbackPhoneNumber: [],
startWork: function() {
var i = 0;
//处理收集的数据,计算中。。。
if (结果出来了) {
for(; i < this.callbackPhoneNumber.length; i++) {
//其中肯定有打给我的电话,嘿嘿。。。。
this.call(this.callbackPhoneNumber[i]);
}
}
},
tellMe : function (phoneNumber) {
this.callbackPhoneNumber.push(phoneNumber);
},
call : function (phoneNumber) {
//调用我就可以打电话了
}
};
var theBoy = {
getWeatherInfo: function () {
weatherStation.tellMe('137XXXXX543');
}
};
weatherStation.startWork();
theBoy. getWeatherInfo();
生活中第二种处事方式,不仅使你不用隔段时间打个电话,能专心的做事,也能让气象站的工作人员免遭你的骚扰,早点计算出结果,与人与己都好。其实抽象成代码也一样,第二种方式能很好的解耦,提高内聚(每个对象做好自己的事情)。这么有用模式在其他场景肯定也会用到,当然要抽象出来,以供代码重用。
在整个事件中,最关键的是气象站什么时候算出天气预报,这是个很重要的事件,大家关心的都是这个事件,不管是“我”还是“气象管理员”谁给谁打电话,都是想要找计算出结果的那个时刻。好,我们来抽象这个事件。事件有几个要素,一:这个事件是谁的,也就是说谁可以触发这个事件,即:事件源;二:这个事件谁关心的,如果你想关心这个事件,你如何关心这个事件,即:事件的绑定;三:如果你知道发生了这个事件,你想要干什么呢?即:事件的处理。抽象成JS代码如下:
var Events = {
bind: function (eventName, callback) {
this.callbacks = this.callbacks || {};
this.callbacks[eventName] = [];
this.callbacks.push(callback);
},
trigger : function (eventName) {
var i = 0;
if ( !this.callbacks) {
return this;
}
if ( !this.callbacks[evntName]) {
return this;
}
for(; i < this.callbacks[eventName].length; i++) {
this.callbacks[eventName].apply(this);
}
}
};
如果某个对象具有事件的特性,只需要继承或混淆(mixed)Events对象到你想要的对象。“某个对象”会就有bind和trigger方法,即绑定事件和触发事件,而某对象本身成为了事件源。
最终我们的代码可以这样写:
var weatherStation = {
startWork: function() {
var i = 0;
//处理收集的数据,计算中。。。
if (结果出来了) {
this.trigger('finished');
}
}
};
jQuery.extend(weatherStation, Events);
var theBoy = {
getWeatherInfo: function () {
weatherStation.bind('finished', function () {
call('137XXXXX543');
}) ;
}
};
weatherStation.startWork();
theBoy. getWeatherInfo();
未完待续。。。。
分享到:
相关推荐
基于事件和时间触发嵌入式系统编程思想 编程思想
linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络编程框架(C++)基于Reactor事件机制,支持线程池,异步非阻塞,高并发,高性能。linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络...
EXTJS中基于事件的编程探究
OpenWhisk是一个无服务器基于事件的编程服务
掌握基于SOCKET的网络编程方法。 基于JAVA语言,编写一个网络应用程序。 一、实验目的 通过套接字编程结合swing框架编写即时通信工具。在知道对方ip的前提下能够发送信息给对方,并得到发送的反馈,对方得到收到的...
基于流程-事件,构建灵活业务代码 阿里技术嘉年华
状态机是编程中一个很好用的程序结构。 这是一个基于事件结构的状态机。
一个很好的基于事件驱动单片机程序设计,源码开发,是开发的很好的参考
这是新软件设计模式的参考实现,允许可组合的基于事件的状态机对其状态进行完全(包括时间)控制。
基于事件的异步模式进行多线程编程.根据MSDN示例改写,MSDN的示例太复杂.对刚接触的人来说,看起来有点头痛.所以精简了部分业务逻辑代码.让初学者只关心技术实现,不受复杂业务逻辑干扰.欢迎高手扔西红柿!
Visual Basic(VB)是一种基于事件驱动的编程语言,主要用于快速开发 Windows 应用程序和其他桌面应用程序
Linux环境下基于事件驱动的视频游戏,这是一个简单的贪吃蛇小游戏
图书目录及源代码-《Delphi基于事件的和异步的编程》 Code examples from Delphi Event-based and Asynchronous Programming Book https://dalija.prasnikar.info/delphiebap/ https://dalija.prasnikar.info
对于更复杂的异步应用程序,可以考虑实现一个符合基于事件的异步模式的类。 使用支持此模式的类,您将能够: 1)异步执行耗时的任务。 2)获得进度报告和增量结果。 3)支持耗时任务的取消。 4...
基于51单片机,编写时间基于时间中断的小型操作系统
GUI编程中几个有用的程序段-GUI编程中几个有用的程序段.pdf 值得学习一下! 讲述的是GUI编程中常常用到的语句
基于LabVIEW和MATLAB混合编程的自适应滤波器设计.pdf 基于LabVIEW和Matlab的自动控制虚拟实验系统.pdf 基于Labview和VC的脑机接口系统设计.pdf 基于LabVIEW和单片机的切削温度虚拟仪器的研究.pdf 基于LabVIEW多...
基于事件的编程 多语言 AB 2015 卡尔加里的第一次多语种非会议将于 2015 年 3 月 28 日举行。 这是我们的电梯演讲,为什么你应该投票支持我们在 Polyglot 的演讲。 语言 有一个用 Python 和 C++ 实现的聊天服务器...
类比于WEB编程的MVC思想,在嵌入式代码中,我们需要处理数据存储(Data)、输入输出(IO)、控制器(Controller)三个种类的业务。而本框架包含大量的数据存储和输入输出中间件,以及各种功能函数库,加上事件驱动的...
1.3 事件处理 1.3.1 使用消息框 1.3.2 使用IntelliSense 1.4 小结 第2章 简单用户界面控件 2.1 用户界面设计原则 2.2 漫游简单用户控件 2.2.1 PictureBox控件 2.2.2 Label控件 2.2.3 Textbox控件 2.2.4 List控件 ...