前不久学习了代理模式,其中有一个核心之一是Proxy.newProxyInstance();这里有三个参数,
loader:目标对象的类加载器 interfaces:目标对象实现的所有接口组成的数组 handler:定义一个调用目标类中方法的回调类
所以我就在想,这个回调函数是什么,看源码也看不懂它怎么运转的。百度搜索了学习了一下,然后做了个小demo。
回调函数:就是一个函数调用另一个函数的过程。(调用某个函数,函数方法中有调用别的函数的动作)
我通过参考学习后自己先练习一个demo来学习深入回调函数。
demo情景:妈妈在做饭,儿子在妈妈把饭做好前要做别的事情比如做作业,打游戏。收到妈妈饭做好的消息后去洗手吃饭。
如果没有回调函数,儿子在妈妈饭做好前什么事情也做不了。
1 package deep; 2 /** 3 * 定义回调函数接口 4 * @author DeepSleeping 5 * 6 */ 7 8 public interface ICookOver { 9 10 void cookOver(); 11 }
1 package deep; 2 3 /** 4 * 5 * @author DeepSleeping 6 * 7 */ 8 public class Mom implements ICookOver{ 9 10 //定义妈妈做好饭后会怎么样的方法 11 @Override 12 public void cookOver() { 13 System.out.println("妈妈把饭做好了,去洗个手来吃饭!"); 14 } 15 16 }
1 package deep; 2 3 /** 4 * 5 * @author DeepSleeping 6 * 7 */ 8 public class Son { 9 ICookOver cookOver; 10 11 public Son(){ 12 13 } 14 15 public Son(ICookOver cookOver){ 16 this.cookOver = cookOver; 17 } 18 19 public void setCookOver(ICookOver cookOver) { 20 this.cookOver = cookOver; 21 } 22 23 //做其他事情知道妈妈把饭做好了 24 public void doOtherUtillCookOver(){ 25 26 System.out.println("儿子在做作业"); 27 System.out.println("作业做完了在打游戏"); 28 29 30 System.out.println("--------------------------------------"); 31 32 //妈妈的饭做好了调用接口中的方法 33 cookOver.cookOver(); 34 35 System.out.println(); 36 System.out.println("儿子去洗手了"); 37 System.out.println("儿子去吃饭了"); 38 } 39 40 41 }
1 package deep; 2 3 public class TestCallBack { 4 5 public static void main(String[] args) { 6 Mom mom = new Mom(); 7 Son son = new Son(); 8 son.setCookOver(mom); 9 10 son.doOtherUtillCookOver(); 11 } 12 }
TestCallBack.class可以利用构造器加载mom
1 package deep; 2 3 public class TestCallBack { 4 5 public static void main(String[] args) { 6 Mom mom = new Mom(); 7 Son son = new Son(mom); 8 son.doOtherUtillCookOver(); 9 } 10 }
TestClaaBack.class也可以直接用匿名实现类来实现同样功能,不过得手写实现类里的方法了。开头提到的Proxy.newProxyInstance();中在之前的代理模式的代码实现中也是利用了匿名实现类来处理实现的。
1 package deep; 2 3 public class TestCallBack { 4 5 public static void main(String[] args) { 6 Son son = new Son(new ICookOver() { 7 8 @Override 9 public void cookOver() { 10 System.out.println("匿名实现类实现---"); 11 System.out.println("妈妈把饭做好啦~快来吃饭!"); 12 } 13 }); 14 son.doOtherUtillCookOver(); 15 } 16 }