public void actionPerformed(ActionEvent e){ //直接调用回调接口的方法,不用关心具体要实现什么功能 callBack.execute(); } } 调用的代码import javax.swing.*;public class MainFrame extends JFrame { public MainFrame(){ setBounds(0,0,500,500); //匿名内部类实现接口 getContentPane().add(new MyButton(new CallBack(){ public void execute(){ JOptionPane.showMessageDialog(null,"hello world!"); } })); setVisible(true); }
public static void main(String[] args){ new MainFrame(); }} 回调的作用在我的应用过程中还是用来解耦合,封装逻辑,使代码更灵活
使用接口
也就是使用多态来实现回调函数
public interface ICallback { public void func(); }
public class ClassWithCallbackFunction implements ICallback{ public ClassWithCallbackFunction() { } public void func(){ System.out.println("cccccccccccccccccc"); } }
public class Caller { ICallback callback; public void doCallback() { callback.func(); } public void setCallback(ICallback callback) { this.callback = callback; }}
public class MainClass { public MainClass() { } public static void main(String[] args) { Caller caller = new Caller(); caller.setCallback(new ClassWithCallbackFunction() { public void func() { System.out.println("aaaaaaaaaa"); } }); caller.doCallback(); } } 现实中是把doCallback()方法放在setCallback里调用,以上是为了说明回调原理 public class Caller { ICallback callback; public void doCallback() { callback.func(); } public void setCallback(ICallback callback) { this.callback = callback; doCallback(); }}
好久没碰JAVA了,当初学JAVA,MVC结构的时候,那个死去活来啊~~~
我run了这些代码,在代码中: public class MainClass { public MainClass() { } public static void main(String[] args) { Caller caller = new Caller(); caller.setCallback(new ClassWithCallbackFunction() { public void func() { System.out.println("aaaaaaaaaa"); } }); caller.doCallback(); //not print ? } } 为什么caller.doCallback()没有打印任何语句,感觉要嘛打印aaaaaaaa,要嘛打印cccccc,但不打印,why?
http://www.iteye.com/topic/182643
还有就是java是通过接口实现回调的,回调方法就是接口中定义的方法,理解的对吗?如果对的话,我的问题是,什么时候用啊?
2.class A实现接口operate
3.class B拥有一个参数为operate接口类型的函数test(operate o)
4.class A运行时调用class B中test函数,以自身传入参数
5.class B已取得A,就可以随时回调A所实现的operate接口中的方法
http://hi.baidu.com/gglzf4/blog/item/772ea21eade9f9f8e1fe0bf4.html
打个比方,你去饭馆吃饭钱包丢了,这时你到前台跟服务员说,如果有人捡到你的钱包交到前台的话,就让服务员通知你一声,过了一会,有人捡到钱包交到前台了,服务员就到你的位置告诉你。这个过程就是回调的过程。你事先在前台寄存了[让服务员通知你]这样的一个方法,该方法必须满足[有人捡到钱包交到了前台],在这个过程中,服务员扮演着监听的角色,当ta收到[有人捡到钱包交到了前台]这样的事件时,ta就调用你事先寄存的[让服务员通知你]这个方法。
你的主管给你一个任务:要求你画一个按钮(JButton的子类)出来,而点击这个按钮要发生什么事,你不用关心,因为你的主管已经把点击后要发生的事情的逻辑写好了,并封装在一个CallBack接口的execute()方法中,你只需要调用这个方法就可以了.
那么你构造这个按钮的时候(在构造方法里),就需要获得这个CallBack接口的实现对象,从而可以在按钮的点击事件中(actionPerformed)执行这个方法.CallBack接口定义interface CallBack{
void execute();
}
按钮类代码import java.awt.event.*;
import javax.swing.JButton;class MyButton extends JButton implements ActionListener{
//回调接口
private CallBack callBack;
public MyButton(CallBack callBack){
super("点我");
//保存回调接口
this.callBack = callBack;
addActionListener(this);
}
public void actionPerformed(ActionEvent e){
//直接调用回调接口的方法,不用关心具体要实现什么功能
callBack.execute();
}
}
调用的代码import javax.swing.*;public class MainFrame extends JFrame { public MainFrame(){
setBounds(0,0,500,500);
//匿名内部类实现接口
getContentPane().add(new MyButton(new CallBack(){
public void execute(){
JOptionPane.showMessageDialog(null,"hello world!");
}
}));
setVisible(true);
}
public static void main(String[] args){
new MainFrame();
}}
回调的作用在我的应用过程中还是用来解耦合,封装逻辑,使代码更灵活
也就是使用多态来实现回调函数
public interface ICallback {
public void func();
}
public class ClassWithCallbackFunction implements ICallback{
public ClassWithCallbackFunction() {
}
public void func(){
System.out.println("cccccccccccccccccc");
}
}
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
} public void setCallback(ICallback callback) {
this.callback = callback;
}}
public class MainClass {
public MainClass() {
} public static void main(String[] args) {
Caller caller = new Caller();
caller.setCallback(new ClassWithCallbackFunction() {
public void func() {
System.out.println("aaaaaaaaaa");
}
});
caller.doCallback();
}
}
现实中是把doCallback()方法放在setCallback里调用,以上是为了说明回调原理
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
} public void setCallback(ICallback callback) {
this.callback = callback;
doCallback();
}}
我run了这些代码,在代码中:
public class MainClass {
public MainClass() {
} public static void main(String[] args) {
Caller caller = new Caller();
caller.setCallback(new ClassWithCallbackFunction() {
public void func() {
System.out.println("aaaaaaaaaa");
}
});
caller.doCallback(); //not print ?
}
}
为什么caller.doCallback()没有打印任何语句,感觉要嘛打印aaaaaaaa,要嘛打印cccccc,但不打印,why?
MainClass只是个Sample做个测试
注册方法就是 public void setCallback(ICallback callback),该例子中监听器只能注册一个回调方法,一般情况下,监听器负责监听事件,可以在不同的事件回调不同的方法,所以,一般监听器带有一个回调方法的集合,这册方法就是把回调方法保存在该集合中,如
class Caller {
List<ICallback> callbackList; //回调方法集合
public void addCallback(ICallback callback) { //注册方法
synchronized(callbackList) {
callbackList.add(callback);
}
} public void someEvent() { //触发某事件时回调注册的方法
syncronized(callbackList) {
for (int i=0; i<callbackList.size(); i++) {
final ICallBack callback = callBackList.get(i)
new Thread() {
public void run() {
callback.runc();
}
}
}
}
}
}