使用javascript和java模仿实现事件回调机制

原创 2016年08月28日 14:46:54

最近在学习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> >();
	
	@Override
	public 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);
	}

	@Override
	public void remove(String eventName) {

		eventMap.remove( eventName );
	}

	@Override
	public 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 stub
		EventEmitter event = new EventEmitter();
		
		event.on("click", new EventHandler() {
			
			@Override
			public void callback(EventService e) {

				System.out.println("click...");
				
				e.trigger("mouseover");
			}
		});
			
		event.on("mouseover", new EventHandler() {
			
			@Override
			public void callback(EventService EventService) {
				
				System.out.println("mouseover...");
			}
		});
		
		event.trigger("click");
		//event.trigger("mouseover");
	}

}
总结: 主要基于观察者的设计模式。采用客户端和服务端分离的思想。使用函数“on”对客户端的回调函数callback进行注册。采用callbackLIst对同一个事件上的回调函数进行存储。最后把每个事件所对应的各自的回调函数列表映射到map中。






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java回调机制(以Android事件监听器为例)

Java的设计模式中有回调这个机制,在Android开发中我们也会经常用到回调机制。下面就通过一些小例子来说明什么是回调。   假如我们要实现这个这样一个功能。 MainActivity中由一个Fra...

C++ 事件回调机制的几种实现方式

1、duilib中的CEventSource。以下代码摘自duilib,并且有一点改动。 delegate.h #include class CDelegateBase { public: ...

详解Android中回调机制与RecyclerView的Item点击事件实现

利用RecyclerView的例子,解释回调的概念。 实现RecyclerView的详细Item点击事件。...

ANDROID jni 中的事件回调机制JNIenv的使用

android framework 里java调用native,使用JNI机制,java如何调用native,在framework里面的例子很多,有很多参考,可以方便的使用。但是在一些native中如...

ANDROID jni 中的事件回调机制JNIenv的使用

android framework 里java调用native,使用JNI机制,java如何调用native,在framework里面的例子很多,有很多参考,可以方便的使用。 但是在一些native...
  • Nio96
  • Nio96
  • 2013年10月28日 14:39
  • 653

ANDROID jni 中的事件回调机制JNIenv的使用

android framework 里java调用native,使用JNI机制,java如何调用native,在framework里面的例子很多,有很多参考,可以方便的使用。 但是在一些native...

Canvas---Canvas图像加载、利用javascript回调机制实现一个图片加载器

canvas的drawImage方法有个缺点,就是当图片还未加载完成时调用它将无效。 当然,在高速运转的游戏主循环中,可以直接忽略这个问题,或者用 img.complete == true来做下判断。...

Java回调机制

  • 2015年11月02日 20:32
  • 14KB
  • 下载

Java/Android回调机制小示例

  • 2016年03月29日 23:05
  • 9KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用javascript和java模仿实现事件回调机制
举报原因:
原因补充:

(最多只允许输入30个字)