java回调摘录

来源:互联网 发布:二进制转十六进制算法 编辑:程序博客网 时间:2024/05/17 01:14

最近看java回调,网上的例子写的蛮多,就是看着不能顺利理解。感觉大部分的例子基本上都可以通过模板模式实现。如果不强调异步响应的话,可以通过在第三个类中调一次Client 的一个方法,而不是把这个方法的调用放在server端作为回调函数。

下面以伪代码为例:

Server端:void invokeByClient(ClientRef, params...){     Object obj = populateParams(params)     ClientRef.callBackFunc(obj);}在Client类中,我们这样调用:void method(){     ServerRef.invokeByClient(this, params...)}

这里如果不用回调的话:

Server端:Object invokeByClient(ClientRef, params...){     Object obj = populateParams(params)}在Client类中,我们这样调用:Object method(){     ServerRef.invokeByClient(this, params...)}--------------------在第三个类中我们这样调用:Object obj = ClientRef.method();ClientRef.callBackFunc(obj);

通过baidu, google, 发现两篇文章很有用:

一个是 Callback (computer programming) ,其中有句话:

In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback or it might happen at later time, as in an asynchronous callback.
另一个是Java:回调机制,关于回调机制的解释:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回      调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。        回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

还有一篇文章将 JAVA 的 Future API 与 回调机制进行关联也是个不错的想法,这个想法与上面讲的"回调和异步调用的关系非常紧密"很一致。

我个人倒是觉得有个场景比较适合回调:

1. Server端有一个List,Client 可以往这个List 注册自己希望Server 进行逻辑处理的对象,这个List 会被定期检查,如果不为空,就迭代处理各个对象,然后通过回调通知相应的 Client , 当然Client 在注册的时候需要留下自己的引用指针。2. Client 端最好能实现 Observer 模式,一旦回调函数被调用就执行相应的逻辑;Server 端最好能实现 Visitor 模式,好处理多个Client 注册的类似的对象。

回调和常规方法处理的优势是,回调函数总是会被确保执行,好比我(Client)对你(Server)提出一个问题,我总是能得到回答(回调函数)。至于我什么时候得到回答,那取决于你,但得到回答后是不是马上响应(处理),则是我自己的事。这些都是和通用调用和异步调用不同的,回调的时间域更广。