本文介绍基于事件编程的基础思想,用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();
未完待续。。。。
分享到:
相关推荐
基于事件和时间触发嵌入式系统编程思想 在嵌入式系统编程中,基于事件和时间触发的编程思想是两种常见的编程结构。事件触发编程方式是基于中断的编程方式,通过中断来响应事件,而时间触发编程方式是基于时间的编程...
"EXTJS中基于事件的编程探究" EXTJS是一款基于JavaScript的开源编程框架,由Sencha公司推出,目前版本已更新至4.0。EXTJS具有面向对象编程、完善的事件监听与响应机制、跨浏览器支持、丰富的可扩展控件支持、高效...
《基于C语言编程MCS-51单片机原理与应用》是一本深入探讨MCS-51系列单片机的书籍,它结合了C语言编程技术,为读者提供了全面而实用的知识体系。MCS-51单片机是Intel公司推出的8位微处理器,广泛应用于工业控制、家用...
通过这个基于MFC的计算器项目,开发者不仅可以掌握Windows程序的基本架构,还能深入理解事件驱动编程模式,以及如何在MFC框架下处理用户输入、执行计算逻辑和展示结果。这个过程对于提升Windows桌面应用的开发技能...
linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络编程框架(C++)基于Reactor事件机制,支持线程池,异步非阻塞,高并发,高性能。linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络...
"基于事件的TypeScript重组编程"是一个关于如何利用TypeScript的特性来构建灵活、可扩展和可组合的状态机模型的实践。这种设计模式特别适用于处理具有多个可能状态变化和响应事件的应用程序。 首先,我们要理解什么...
《C++基于Windows编程的打飞机小游戏源代码详解》 在计算机编程的世界中,C++是一种强大而灵活的编程语言,常用于开发高效、高性能的应用程序。而在游戏开发领域,C++更是扮演着重要的角色。本篇文章将深入探讨一个...
在LabVIEW中实现基于事件结构的状态机,开发者可以利用其独特的数据流编程模型,通过拖放图形化编程元素,如事件结构、状态节点和转换箭头,来直观地构建状态机模型。这样不仅提高了代码的可读性和可维护性,还能...
基于事件驱动的设计理念,单片机能够实时响应外部或内部发生的特定事件,如传感器输入、按键按下、通信中断等,从而实现灵活且高效的控制逻辑。以下是对这一主题的详细探讨: 1. **事件驱动编程概念**:事件驱动...
### 基于SOCKET的网络编程知识点解析 #### 一、实验背景与目标 本实验旨在通过实际操作,使学生深入理解并掌握基于SOCKET的网络编程技术。实验选择了Java语言作为开发工具,利用Swing框架来构建图形用户界面(GUI...
基于事件驱动的串口通讯控件则是在编程时实现串口通信的一种高效手段。 1. 事件驱动编程 事件驱动编程是一种编程模型,其中程序的执行依赖于外部事件的发生。在这种模型中,程序并不持续检查数据或状态变化,而是...
总结来说,基于Windows编程的简单计算器项目涵盖了Windows API的基本使用、事件驱动编程、C++的数据结构和算法以及用户界面设计。通过实践这个项目,开发者不仅能提升对Windows编程的理解,还能增强解决问题和调试...
【基于MFC的UDP网络编程】是针对Visual Studio 2010环境下,利用Microsoft Foundation Classes(MFC)库进行的用户数据报协议(UDP)的网络编程实践。MFC是微软提供的一种C++类库,它封装了Windows API,使得开发者...
在基于 UDP 的 Socket 编程中,程序创建套接字句柄成功以后,可以直接调用函数进行数据的收发,不需要调用任何函数连接服务器或者接受客户端的连接事件的操作。UDP 协议在即时通信中对一些对时间要求较高的网络数据...
1. **MFC消息映射**:MFC使用消息映射机制来处理窗口消息,通过ON_MESSAGE、ON_COMMAND等宏将消息与成员函数关联起来,实现事件驱动的编程模型。 2. **对话框类(CDialog)**:邮件设置通常会通过对话框进行,...
可能涵盖基本的I/O操作、定时器和事件处理等编程技巧。 6. **错误处理与调试**:介绍在Labview编程过程中可能出现的问题及解决方法,如何使用Labview的内置工具进行错误诊断和程序调试。 7. **应用案例**:提供...
**基于TCP协议的通信编程**是网络编程中的一个重要领域,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据在网络中的完整性和顺序,为应用程序提供了可靠...
综上所述,"基于MFC的OpenGL编程"涉及到MFC框架的理解、OpenGL的集成、SDI视图的定制、双缓冲技术的应用以及事件驱动的图形更新。通过学习和实践这些知识点,开发者可以创建出交互性强、性能优良的图形应用程序。
6. 事件驱动编程:MFC的Socket编程通常采用事件驱动模型,利用消息机制响应网络事件。例如,当有新的连接请求或数据到达时,MFC会发送一个消息到消息队列,然后由应用程序处理。 7. 多线程:在处理多个并发连接时,...
在Linux环境中进行程序设计,尤其是开发基于事件驱动的视频游戏,是一种挑战且有趣的技术实践。本文将深入探讨如何在Linux操作系统下实现一个简单的贪吃蛇游戏。贪吃蛇游戏是许多初学者接触游戏编程的首选项目,因为...