`
isiqi
  • 浏览: 16039002 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java "回调【 Callback 】" 的理解和使用<借鉴>

 
阅读更多

对callback,暂时的理解是:A对象调用B接口的b方法,b方法又反过来调用A对象中的c方法。

A调用B接口时把自身给B接口,至于怎么处理,由B的实现类去做,不关A的事。


写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。
这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,


至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。


第二种理解:


【1】必须有一个接口,声明实现子类必须实现的方法,比如:


public interface Icalc{


public Object doCalc(int a,int b);


}


【2】中间使用类在自己方法中只针对以上接口进行编程,在自己的方法中以 接口为参数,在方法体中调用接口的方法来完成自己额业务逻辑,具体的逻辑实现不用考虑。
具体实现被推给调用这个使用类的用户完成!


【3】最外层是真正业务逻辑代码的提供者,它去调用【2】步骤中定义的方法时,因为该方法有一个接口参数的变量,
因此它必须在这时实现这个接口,供【2】步骤中相应方法来调用。


本来是调用【2】步骤中的方法,到真正调用时,反过来【2】步骤的方法还要调用【3】步骤中对接口的实现,来完成业务逻辑,
这正应了这个概念的名字 "回调(callback)" !


第三种理解:


总听见Callback如何如何,姑且不评判它的好坏,但是的确提供了一种code的新方式。

Callback我理解是调用方 调用 被调用方函数执行过程中,
被调用方 选择执行 调用方(至少是调用方初始化出来的)的某些函数来通知 调用方或者按照调用方的意愿做某些改变。

Spring中的JdbcTemplate的query方法和execute方法就使用了大量的Callback。

初始场景:A——调用者;B——被调用者。

最简单的方式是 A的方法调用B的过程中,A将自身this作为一个参数传递给到b的执行函数中。
这样,在执行b的方法时,就能够反过来操纵a的方法了。但是这种方式A和B循环依赖。不是一种很好的选择。

一种更为优雅的方式是:申明一个ICallBack接口,作为执行B方法的参数。
B在执行自己代码的过程中,执行callback对象对应的方法。
那么,在A开始调用时,实现ICallBack接口(可以大量使用A自身的资源:a知道该怎么办),并且在调用B方法时将callback对象传入。
这样,A依赖于Callback,B也依赖于CallBack。因此有效的解耦。





应用场景:A有多个方法要调用B的某个方法,B的这个方法很多逻辑相同,但是,小部分逻辑根据A的调用方法不同而不同。
因此,使用Callback方法:1)创建ICallback接口;
2)在A的调用地方实现callback类;
3)在这个类中写不同的业务逻辑;
4)B的方法写固定的业务逻辑并且接受ICallBack对象执行。





可能出现的问题:如果A的若干个执行方法中,要求响应对象不一致,尝试泛型是否可以解决!


实例理解:





测试类:



JAVA实现回调【摘抄,很经典】
熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。
Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。


Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。


例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:


这样我们就有了任何一个实现了这个接口类对象的手柄grip。


当一事件发生时,需要通知实现InterestingEvent 接口的对象,并调用interestingEvent() 方法。


在这个例子中,用somethingHappened 来标志事件是否发生。


希望接收事件通知的类必须要实现InterestingEvent 接口,而且要把自己的引用传递给事件的通知者。


以上是通过一个非常简单的例子来说明Java中的回调的实现。

以下为经典实例演示:
当然,也可以在事件管理或事件通知者类中,通过注册的方式来注册多个对此事件感兴趣的对象。
1. 定义一个接口InterestingEvent ,回调方法nterestingEvent(String event) 简单接收一个String 参数。


2. 实现InterestingEvent接口,事件处理类


3. 事件管理者,或事件通知者






4. 测试



分享到:
评论

相关推荐

    C#基础全接触

    &lt;br&gt;代表主要有二个用途:回调(Callback)和事件处理(event)&lt;br&gt;回调通常用于异步处理和自定义处理。例:&lt;br&gt;class DBManager&lt;br&gt;{&lt;br&gt; static DBConnection[] activeConnections;&lt;br&gt; //声明回调函数&lt;br&gt; public ...

    Visual C++ 编程资源大全(英文控件)

    1,01.zip&lt;br&gt;Toolbar - Custom status messages and tooltips&lt;br&gt;用户状态信息与工具提示(3KB)&lt;END&gt;&lt;br&gt;2,02.zip&lt;br&gt;Remove system menu from floating toolbar&lt;br&gt;从浮动工具条中去除系统菜单(2KB)&lt;END&gt;&lt;br&gt;3,03....

    jquery-1.1.3 效率提高800%

    &lt;br&gt;Safari 2 3575ms 475ms 753% &lt;br&gt;Opera 9.1 3196ms 326ms 980% &lt;br&gt;Average improvement: 867% &lt;br&gt;&lt;br&gt;下表为jQuery1.1.3与常用的一些JS库选择器的对比:&lt;br&gt;Browser Prototype jQuery Mootools Ext Dojo &lt;br&gt;...

    Ajax for asp.net

    在web.config中设置httpHandleer标签&lt;br&gt; &lt;configuration&gt;&lt;br&gt; &lt;system.web&gt;&lt;br&gt; &lt;httpHandlers&gt;&lt;br&gt; &lt;add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" /&gt;&lt;br&gt; &lt;/httpHandlers&gt;&lt;br&gt; &lt;/...

    任务管理器源代码

    反正不错了.&lt;br&gt;&lt;br&gt;&lt;br&gt;INT_PTR CALLBACK MainWindowProc(&lt;br&gt; HWND hwnd, // handle to dialog box&lt;br&gt; UINT uMsg, // message&lt;br&gt; WPARAM wParam, // first message parameter&lt;br&gt; LPARAM lParam // second ...

    J2EE.v1.3.1.API.chm

    v 1.3&lt;br&gt;API Specification &lt;br&gt;Compiled to .CHM by 貀vind Stegard&lt;br&gt;...callback &lt;br&gt;javax.security.auth.login &lt;br&gt;javax.security.auth.spi &lt;br&gt;javax.servlet &lt;br&gt;javax.servlet.http &lt;br&gt;javax.servlet.jsp ...

    多文件无刷新上传控件

    多个用|分隔,如gif|jpg|png &lt;br&gt;Size 上传文件大小 (KB) 默认256KB &lt;br&gt;TimeOut 上传超时设置 (秒), 默认30秒 &lt;br&gt;CallBack Js回调函数名&lt;br&gt;&lt;br&gt;例:&lt;hn:FileUpload ID="ajaxUpload" IsMuch="true" runat="server...

    Visual C++ 编程资源大全(英文源码 DLL)

    1,01.zip&lt;br&gt;Dialogs in DLL&lt;br&gt;在DLL中实现对话框(5KB)&lt;END&gt;&lt;br&gt;2,02.zip&lt;br&gt;Export dialogs in MFC Extension DLLs&lt;br&gt;在MFC扩充DLL中输出对话框(12KB)&lt;END&gt;&lt;br&gt;3,03.zip&lt;br&gt;Remapping resource script ID's&lt;br&gt;...

    mybatis generator Java类方法生成

    &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;version&gt;5.1.45&lt;/version&gt; &lt;/dependency&gt; &lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis&lt;/...

    VB编程资源大全(英文源码 API)

    drvtype.zip&lt;br&gt;Determine Drive Type&lt;END&gt;&lt;br&gt;47,findcd1.zip&lt;br&gt;Find the First CD-ROM&lt;END&gt;&lt;br&gt;48,xxsShell32.zip&lt;br&gt;Shell32 functions and subs wrapper for VB developers.&lt;END&gt;&lt;br&gt;49,api2.zip&lt;br&gt;This ...

    用web.xml控制Web应用的行为

    用web.xml控制Web应用的行为&lt;br&gt;目录&lt;br&gt;1 定义头和根元素 2&lt;br&gt;2 部署描述符文件内的元素次序 2&lt;br&gt;3 分配名称和定制的UL 3&lt;br&gt;3.1 分配名称 3&lt;br&gt;3.2 定义定制的URL 5&lt;br&gt;3.3 命名JSP页面 6&lt;br&gt;4 禁止激活器...

    DWR中文文档.pdf

    DWR中的JavaScript简介 44&lt;br/&gt;5.1 简单的回调函数 44&lt;br/&gt;5.2 调用元数据对象 45&lt;br/&gt;5.3 查找回调函数 45&lt;br/&gt;5.4 创造一个与Java对象匹配的Javascript对象 46&lt;br/&gt;&lt;br/&gt;第6章. engine.js 功能 47&lt;br/&gt;6.1 使用...

    漂亮的ComponentArtWebUI及Demo源码(商业版带安装序列号)part1

    &lt;br&gt;ComponentArt Web.UI 包含以下用户界面控件&lt;br&gt;&lt;br&gt; Calendar (日历)&lt;br&gt; Grid (表格) Rotator (旋转器) TabStrip (标签) &lt;br&gt; CallBack (回调) Menu (菜单) SiteMap (地图) ToolBar (工具条) &lt;br&gt; ComboBox ...

    漂亮的ComponentArtWebUI及Demo源码(商业版带安装序列号)part2

    &lt;br&gt;ComponentArt Web.UI 包含以下用户界面控件&lt;br&gt;&lt;br&gt; Calendar (日历)&lt;br&gt; Grid (表格) Rotator (旋转器) TabStrip (标签) &lt;br&gt; CallBack (回调) Menu (菜单) SiteMap (地图) ToolBar (工具条) &lt;br&gt; ComboBox ...

    HGE 1.8.1 游戏开发引擎(支持UNICODE和手柄Joystick)

    HGE 1.8.1a Unicode Edition and Support Joystick&lt;br&gt;&lt;br&gt;中文的使用方法:&lt;br&gt;1、现将现在的工程转换为UNICODE,否则会提示找不到hgeFont符号。&lt;br&gt;2、在用到的字符串处使用宏TXT()进行字符处理(hge中自带的),也可...

    Android 通过自定义Dialog来理解接口回调callback

    通过简单的自定义Dialog来理解接口回调callback机制

    Android java 回调例子

    相信很多初学android java的童鞋们都不太懂回调的意思,我当时也是这样的什么这个跳到那个然后又从那个调用这个的方法。。。弄得晕头转向的,今天我突然顿悟,于是写了一个回调例子与大家分享,由于手头分不多了,...

    成员函数用于回调函数

    如qsort 等函数需要函数指针才能回调 用此函数库可以将成员函数指针转为普通函数指针 测试代码如下 #include &lt;stdio.h&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include ...

    C++中回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...

Global site tag (gtag.js) - Google Analytics