• 收藏

委托 —— 连载 (三)Java的委托与回调

2017/9/12 20:59:47   易思捷科技


Java中没有委托概念,所以还是从微软提供的委托概念说起。

在前面讲到,委托实际就是一个方法的引用,从官网文档来看,委托用途有三:

1、将方法作为参数传递,譬如:静态方法;

2、定义回调;

3、为事件提供基础;

基于此定义,及用途,来看看Java如何实现?

首先java是没有委托的,而针对于回调(前面也讲到了,回调不是一种技术,而是一种方式或者是机制),则是也采用了同样的处理方式,即:接口。实际在Java领域中,很多都是这样的实现方式,形成一定的模式之后,就成为了设计模式。这样的模式会经常用到,于是再起一个比较贴切的名字就可以了。

所以,在入门的时候,.Net比Java的门槛要低一些,这不仅是语言的本身,同时,从.Net方面,微软尽可能的将已经成熟的内容为您封装好并提供给您使用,而Java则是需要您仔细研究,并深入各种套路,才可掌握,所以,.Net的入门确实比较简单一些。但对于初学者,我觉得这是非常友好的,不至于一下陷入繁杂的概念中。更加有利于去掌握编程本身,毕竟语言只是一种工具而言,脱离开.Net和Java,难道就不去做软件了么?好了,言归正传。

针对于委托Java的做法是接口。实际在.Net平台中,也讲到了这个问题,大家可以参考《When to Use Delegates Instead of Interfaces》,所以可以看出委托和接口还是有一定的相似性。所以针对于第一、二点,我们直接来看Java回调的做法。

譬如:我们做一个网页爬虫,我们只需要提供一个Url,则返回这个页面的网页源码,然后对源码进行分析(分析部分省略)。爬虫在检索url的时候,会受到网络及目标网站响应时间等因素的影响,有时会很快(1-2秒),也会很慢(甚至几十秒)。所以,对于调用者来讲,不能一直去等待爬虫返回数据,所以调用后,调用者去做一些其他的事情,等待爬虫完成网页源码的获取,然后再通知调用者去完成分析的事务。这是一个典型的异步回调需求。

首先先定义一个接口:


public interface CallBackInterface {    public void sendOver(String webSource);  }

然后我们定义两个类:一个是爬虫类,一个是具体的http通讯类,爬虫类负责Url源码请求及源码处理。http通讯类负责网页源码的获取工作。爬虫类:

public class netSpider implements CallBackInterface
{           
private HttpCommunication m_hCommunication;             
public netSpider(HttpCommunication hCommunication)
{          this.m_hCommunication = hCommunication;      }            

public void HttpGet(String Url)   
 {               
new Thread(new Runnable() {             
 public void run() {                 
 m_hCommunication.getHtml(netSpider.this, Url);            }          
}).start();                    
ETL();    
}       
 private void ETL()    
{        
System.out.print("这是网页源码的处理逻辑!");   
 }         
public void sendOver(String webSource) 
{          System.out.print(webSource);    }        
}


http通讯类:

   class HttpCommunication {        
public void getHtml(CallBackInterface callBack, 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)       
 {                }                
callBack.sendOver(result);           
}
}


再看下测试代码:

 public static void main(String[] args)   
 {               
 HttpCommunication hCommunication = new HttpCommunication();          
netSpider hUtil=new netSpider(hCommunication) ;        
hUtil.HttpGet("http://www.minerspider.com");            
}

最终输出:


这是网页源码的处理逻辑!
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title>    网络矿工数据采集软件——专注互联网数据挖掘【Soukey采摘开源采集器 大数据采集服务】.................................


爬虫类实现了回调的接口,并实现了回调后应该进行的业务逻辑。而在被调用者http通讯类中,将回调接口传入,在处理完相关逻辑后触发回调接口方法,即实现了回调的最终操作。

下一章节,讲一下java的事件机制,看看与.Net又有何不同。

版权声明:如无特别说明,均为“易思捷IT训练营”原创,如转载请著名出处!

阅读:218  评论:0  
  • 评论