刚接触java时不明白是什么是回调函数,也不知道回调函数有什么作用,在工作中也碰到了回调函数的应用,例:Spring中的HibernateTemplate类中就有用到。于是在网上查了一下关于回调函数的资料,很多都是举打电话的例子来解释java中的回调函数,我看完之后,还是不太明白其中回调的含义。下面是我对回调函数的理解
class A 是做主板的,class B 是做CPU的,突然有一天class A想自己组装电脑,于是就找到B谈判,A提供主板给B,由B负责将其组装起来然后给A,于是双方签订了一个协议(即定义一个接口CompCallback),接口中定义了生产内存、显卡、网卡等方法并由B去实现。class A给自己增加了一个获得电脑的方法,该方法有一个CompCallback(双方的协议)参数。class A拿出自己生产的主板,便把class B叫来,要求B带着双方定的协议(CompCallback)去会合。双方见面之后A把自己生产的主板交给B并跟B说我的主板给你了,任务已经完成了,组装的事就由你去完成。B对A说:好的,我现在回去把这些配件组装好便拿过来给你,(B回调自己的方法)B便回去调用自己的方法开始组装电脑。代码实现如下:
public interface CompCallBack<T> {
T doinComputer(MainBoard mainBoard);
}
public class A {
MainBoard productMainBoard(){
return new MainBoard();
}
<T> T executeCallB(CompCallBack<T> compcallback){
System.out.println("================A开始准备 MainBoard ============");
MainBoard mainBoard=productMainBoard();
//此时A提供主板给B,B拿着主板回调自己的doinComputer方法和其它的方法
return compcallback.doinComputer(mainBoard);
}
public Computer getComputer(){
//A把B(B必须要带着双方的协议才能通过)叫过来,并要B把电脑组装好之后再给A
return (Computer)executeCallB(new B());
}
//此处用内部类实现(),也可用匿名内部类
class B implements CompCallBack<Object>{
public B(){
System.out.println("================调用B============");
}
public Object doinComputer(MainBoard mainBoard) {
Memory memory=productMemory();
NetWorkCard netWorkCard=productNetWorkCard();
VideoCard videoCard=productVideoCard();
return fittingComp(mainBoard,memory,netWorkCard,videoCard);
}
public Memory productMemory(){
return new Memory();
}
public NetWorkCard productNetWorkCard(){
return new NetWorkCard();
}
public VideoCard productVideoCard(){
return new VideoCard();
}
public Computer fittingComp(MainBoard mainBoard,Memory memory,NetWorkCard netWorkCard,VideoCard videoCard){
System.out.println("================开始组装电脑============");
Computer computer=new Computer();
computer.setMainBoard(mainBoard);
computer.setMemory(memory);
computer.setNetWorkCard(netWorkCard);
computer.setVideoCard(videoCard);
System.out.println("================电脑组装完成============");
return computer;
}
}
}
public class Computer {
private MainBoard mainBoard;
private Memory memory;
private NetWorkCard netWorkCard;
private VideoCard videoCard;
public MainBoard getMainBoard() {
return mainBoard;
}
public void setMainBoard(MainBoard mainBoard) {
this.mainBoard = mainBoard;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
public NetWorkCard getNetWorkCard() {
return netWorkCard;
}
public void setNetWorkCard(NetWorkCard netWorkCard) {
this.netWorkCard = netWorkCard;
}
public VideoCard getVideoCard() {
return videoCard;
}
public void setVideoCard(VideoCard videoCard) {
this.videoCard = videoCard;
}
}
public class MainBoard {
public MainBoard(){
}
}
public class Memory {
}
public class NetWorkCard {
}
public class VideoCard {
}
public class TestCompCall {
public static void main(String args []){
A a=new A();
a.getComputer();
}
}