• 收藏

委托 —— 连载 (四)Java的事件

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训练营”原创,如转载请著名出处!

阅读:211  评论:0  
  • 评论