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