2017/9/14 15:40:27 易思捷科技
严格意义上来讲,这个和委托已经没有半毛钱的关系了。只是由于在讲委托,而委托是.Net的概念,由.Net的委托引出了事件,因为委托是事件的基础,因此此连载文章就一直延续至今。
来看看Java的事件机制吧。事件是任何语言中非常重要的内容。Java的事件也包含了几个部分:
1、EventObject:事件基类,在此封装有关事件的信息;
2、EventListener:事件监听接口,基于此实现事件监听器,并在事件源中进行注册;
3、Source:事件源,很容易理解,触发事件的地方;
我们用前面讲到的回调例子,采用事件机制进行重写,然后开始对Java事件机制进行分析。
public class SendOverEvent extends EventObject {
private static final long serialVersionUID = 1111;
private String m_WebSource;
public SendOverEvent(Object source) {
super(source);
m_WebSource = ((httpUtil)source).GetWebSource();
}
public String GetWebSource()
{
return m_WebSource;
}
}
class HttpListener implements EventListener {
public void handleSendOverEvent(SendOverEvent event) {
System.out.println("采集完成事件触发,打印源码如下:");
System.out.println(event.GetWebSource());
}
}
再看下改造后的获取网页源码的代码
public class httpUtil {
Set<HttpListener> listeners ;
public void addSendOverListener(HttpListener listener) {
if (listeners == null) {
listeners = new HashSet<HttpListener>();
}
listeners.add(listener);
}
public void removeSendOverListener(HttpListener listener) {
if (listeners == null)
return;
listeners.remove(listener);
}
public void notifyListener() {
for (HttpListener listener : listeners) {
try {
((HttpListener)listener).handleSendOverEvent(new SendOverEvent(this));
} catch (Exception e) {
}
}
}
private String m_WebSource;
public void getHtml(String Url)
{
String result = "";
try
{
URL realUrl = new URL(Url);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
m_WebSource=result;
notifyListener();
}
public String GetWebSource()
{
return m_WebSource;
}
}
剩下的就是测试了
httpUtil hUtl1 = new httpUtil();
hUtl1.addSendOverListener(new HttpListener());
hUtl1.getHtml( "http://www.minerspider.com");
再回头看下事件三要素:
1、触发事件的场景,也就是事件源,当发生一些事情的时候,开始触发事件,从而引发其他的操作;
2、事件数据,在事件触发的过程中,通常是需要传递一些数据的,这些数据有可能是与事件本身有关,也可能是事件源中的一些数据;
3、事件监听器,当事件源满足了某种条件后,开始触发事件,则监听器获得此消息,开始处理事件事务;
根据以上的描述,我们可以看出,要完成一次事件,至少需要将事件监听器与事件源关联起来,当事件源满足某种条件需要触发事件,则检查当前事件源中是否注册了事件监听器,如果有,则进行调用。
如果仔细看,发现好像和回调有点像,注册监听,满足条件触犯,即进行回调操作。
这个就是Java的事件机制了。
至此,委托我们基本上就全部讲完了,但实际还留下了一个尾巴,事件,事件我们只讲了实现,但没有去真正分析其机制原理,并将Java和.Net放在一起比较两者之间的不同。因此,下一篇将深入讲解事件机制,并顺道说说事件驱动。
版权声明:如无特别说明,均为“易思捷IT训练营”原创,如转载请著名出处!