回调函数在之前之一听到,但是具体是个啥还真说不出个之所以然来,所以特地写下这篇文章
回调函数它那传呼其神的效果是如何实现的呢?说白了,就是接口的应用,从这里也将看到接口的好处。
情景模拟
有两个用户 追本溯源和王小贱 需要在磁盘中记录本周末的计划,这记录要涉及非常非常庞大的技术,而且将来有更多的用户需要记录,无奈,请了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(); } }
追本溯源:
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中调用execute呢,如果有一种情况,我需要在另外一个类中调用execute ,而 execute 需要 实现了接口的类对象(A)中的一些方法(如何实现和上面相同)。这里仅仅是将调用的位置改变一下,其他的都不变。
这种写法我将在动态代理中的动态代理简单改写中介绍。