使用javascript和java模仿实现事件回调机制
来源:互联网 发布:魔兽争霸软件下载 编辑:程序博客网 时间:2024/05/16 17:05
最近在学习nodejs中的eventEmitter类的时候。被它的事件注册回调机制的编程风格所吸引。于是决定使用javascript和java来模仿实现这种机制。
nodejs代码
//event.js 文件var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { console.log('listener1', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('listener2', arg1, arg2); }); emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
emitter使用on方法绑定事件"someEvent",然后注册对应的回调函数。
在javascript中这种方式屡见不鲜。$('#div_id').on('click', function(){});
一.javascript实现这种机制
1.服务端代码
EventEmitter = function(){var eventsMap = {};var _this = this;var on = function( name, callback ){var callbackList = eventsMap[name] || [];callbackList.length > 0? ( eventsMap = eventsMap ):( eventsMap[name] = callbackList );return callbackList.push(callback);};var emit = function(){var name = Array.prototype.shift.call(arguments);var callbackList = eventsMap[name];for( var i = 0,len = callbackList.length; i < len; i++ ){var result = callbackList[i].apply( _this, arguments );if( result != void 0 ){return false;}}return true;}var remove = function(name){return delete eventsMap.name;}return {"on" : on,"emit" : emit,"remove": remove};}
2.客户端代码
var event = new EventEmitter();event.on("click", function( data ){console.log("click1...");console.log( data.name );});event.on("click", function( data ){console.log("click2...");console.log( data.name );});event.on("mouseover", function( data ){console.log("mouseover...");console.log( data.age + ":" + data.add );});event.emit( "click", {"name": 'lilei} );event.emit( "mouseover", {"age": 12, "add": "shanghai"} );
二.java实现这种机制
1.编写接口EventService
package inter;public interface EventService {void on( String eventName, EventHandler e );void remove( String eventName );void trigger( String eventName );}
2.编写接口EventHandler
package inter;public interface EventHandler {void callback( EventService eventService );}
3.编写服务端实现类EventEmitter
package interimpl;import inter.EventService;import inter.EventHandler;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class EventEmitter implements EventService {private Map< String, List<EventHandler> > eventMap = new HashMap< String, List<EventHandler> >();@Overridepublic void on(String eventName, EventHandler EventHandler) {List<EventHandler> callbackList = eventMap.get(eventName);if( null == callbackList ){ callbackList = new ArrayList<EventHandler>();}if( callbackList.isEmpty() ){eventMap.put(eventName, callbackList);}callbackList.add(EventHandler);}@Overridepublic void remove(String eventName) {eventMap.remove( eventName );}@Overridepublic void trigger( String eventName ) {List<EventHandler> callbackList = eventMap.get(eventName);for( EventHandler inter : callbackList ){inter.callback(this);}}}
4.编写测试客户端
package client;import inter.EventService;import inter.EventHandler;import interimpl.EventEmitter;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubEventEmitter event = new EventEmitter();event.on("click", new EventHandler() {@Overridepublic void callback(EventService e) {System.out.println("click...");e.trigger("mouseover");}});event.on("mouseover", new EventHandler() {@Overridepublic void callback(EventService EventService) {System.out.println("mouseover...");}});event.trigger("click");//event.trigger("mouseover");}}总结: 主要基于观察者的设计模式。采用客户端和服务端分离的思想。使用函数“on”对客户端的回调函数callback进行注册。采用callbackLIst对同一个事件上的回调函数进行存储。最后把每个事件所对应的各自的回调函数列表映射到map中。
0 0
- 使用javascript和java模仿实现事件回调机制
- Java 事件机制(模仿Flex事件机制)
- 使用javascript模拟观察者模式和事件监听广播机制
- 使用java事件机制实现清理redis中临时数据
- javascript事件机制底层实现原理
- Java 事件机制的使用
- Java实现模仿登陆
- Javascript 模仿 java bean 实例
- javascript事件处理机制---事件监听、捕获和冒泡
- 事件和数据回发机制的实现
- 使用c++的成员指针实现类似Borland VCL组件的事件回调机制(上)
- 使用c++的成员指针实现类似Borland VCL组件的事件回调机制(下)
- 【Java系列】(五)java实现简单的窗体和密码验证(传参,事件机制和事件监听)
- 游戏开发中的事件机制Java实现
- JavaScript之使用JavaScript模仿oop编程
- javascript事件监听机制
- Javascript事件处理机制
- javascript的事件机制
- hdu 2448 Mining Station on the Sea【费用流】本代码思路仅供参考
- 静态成员应用
- [C/C++笔面试]自己编程实现strcmp
- 2691:打印极值点下标(百练)
- cocos2dx - 网络编程
- 使用javascript和java模仿实现事件回调机制
- c#编程之@的3种作用
- Eventbus3.0的基本使用以及在企业中如何EventBus
- 向量积
- 个人感想之----安装环境
- 笔试选择题十
- Runnable和Callable接口的区别
- javaScript循环
- kaggle之人脸特征识别