回调函数在之前之一听到,但是具体是个啥还真说不出个之所以然来,所以特地写下这篇文章
回调函数它那传呼其神的效果是如何实现的呢?说白了,就是接口的应用,从这里也将看到接口的好处。
情景模拟
有两个用户 追本溯源和王小贱 需要在磁盘中记录本周末的计划,这记录要涉及非常非常庞大的技术,而且将来有更多的用户需要记录,无奈,请了apache组织中的一个神秘高手设计了一个具体实现该功能的方法。可是在设计的过程中问题出现了,这个功能需要针对不同的用户先初始化信息,才能完成整个记录功能。而这位apache高手需要设计的是一个针对各个用户的通用方法,如何解决 初始化用户信息的那一块动态的操作呢? apache高手思考了一下,想出了下面的技术
技术应用:
初始化信息难题解决:采用接口,在service中只用一个规范统一的接口函数代替,具体的实现根据客户端对接口的实现来指定不同的初始化方式。
代码示例:
首先定义一个接口
package callbackTs;public interface InterfaceTs {public void function(String name);
}
然后在将apache写好的类封装在一个类中,可以给各个用户使用:
package callbackTs;/*** 这是apache高手写下的通用类* 具体实现非常之复杂的记录功能* @author 追本溯源**/
public class ServiceTs {InterfaceTs interfaceTs;public ServiceTs(InterfaceTs interfaceTs){this.interfaceTs = interfaceTs;}/** 该方法是完成一个功能,给客户端提供**/public void execute(String plan){System.out.println("欢迎使用计划留言板块,请在下边写下你周末的计划");//该计划需要根据调用者不同,动态显示不同计划//所以要满足这点,接口是关键,在下边提供一个规范的统一接口函数interfaceTs.function(plan);System.out.println("哎呀,不错的主意");//将计划写入本地磁盘中,省略//writerToDisk();}
}
最后2位主角上场测试了
追本溯源:
package callbackTs;public class ClientTs implements InterfaceTs{/** 回调函数**/public void function(String plan) {System.out.println(plan+":我的计划是先上网看个电影--在写点代码--逛逛公园");}/** 将本周末的计划记录**/public void writePlan(){//要完成该功能,要调用service类中已经封装好的execute方法ServiceTs st = new ServiceTs(this);String plan = "追本溯源";st.execute(plan);}public static void main(String[] args) {ClientTs ct = new ClientTs();ct.writePlan();}}
结果:
欢迎使用计划留言板块,请在下边写下你周末的计划
追本溯源:我的计划是先上网看个电影--在写点代码--逛逛公园
哎呀,不错的主意
王小贱:
package callbackTs;public class ClientOtherTs implements InterfaceTs{/** 回调函数**/public void function(String plan) {System.out.println(plan+":我的计划是先打盘游戏--在写点代码--陪陪女友");}/** 将本周末的计划记录**/public void writePlan(){//要完成该功能,要调用service类中已经封装好的execute方法ServiceTs st = new ServiceTs(this);String plan = "王小贱";st.execute(plan);}public static void main(String[] args) {ClientOtherTs cot = new ClientOtherTs();cot.writePlan();}}
结果:
欢迎使用计划留言板块,请在下边写下你周末的计划
王小贱:我的计划是先打盘游戏--在写点代码--陪陪女友
哎呀,不错的主意
我看了一下回调函数的解释:A 类 a1 函数调用 B类 execute函数实现功能,execute需要根据A类的具体情况才能完成功能,所以A类实现了一个回调函数callback。execute调用callback函数,但是如何调用呢,这需要将A类对象传入,对方用A实现的接口 进行接收,用接口完成调用callback。
我在想为什么要在A中调用execute呢,如果有一种情况,我需要在另外一个类中调用execute ,而 execute 需要 实现了接口的类对象(A)中的一些方法(如何实现和上面相同)。这里仅仅是将调用的位置改变一下,其他的都不变。
这种写法我将在动态代理中的动态代理简单改写中介绍。