callback的理解与Java实例

文章分类:Java编程
对callback,暂时的理解是: A对象调用B接口的b方法,b方法又反过来调用A对象中的c方法。 
A调用B接口时把自身给B接口,至于怎么处理,由B的实现类去做,不关A的事。
 

写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。 

BadBoy: 
Java代码 
  1. class BadBoy {  
  2.     String name;  
  3.   
  4.     public BadBoy(String name) {  
  5.         this.setName(name);  
  6.     }  
  7.   
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.         //打人  
  16.     public void hit(Hitable hitable) {  
  17.         System.out.println("----------------BEGIN----------------");  
  18.         System.out.println("badboy " + this.getName() + "打了"  
  19.                 + hitable.getName() + "一拳");  
  20.         hitable.beHit(this);  
  21.         System.out.println("-----------------END----------------");  
  22.     }  
  23.   
  24. }  


挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来。 
Java代码 
  1. interface Hitable {  
  2.     public void beHit(BadBoy boy);  
  3.   
  4.     public String getName();  
  5.   
  6.     public void setName(String name);  
  7. }  


Child:这个类实现了Hitable,小孩挨打了,反应是哭。。 
Java代码 
  1. class Child implements Hitable {  
  2.     String name;  
  3.   
  4.     public Child(String name) {  
  5.         this.setName(name);  
  6.     }  
  7.   
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     @Override  
  17.     public void beHit(BadBoy boy) {  
  18.         System.out.println("child " + this.getName() + "被" + boy.getName()  
  19.                 + "打哭了");  
  20.     }  
  21.   
  22. }  


BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。 
Java代码 
  1. class BigMan implements Hitable {  
  2.     String name;  
  3.   
  4.     public BigMan(String name) {  
  5.         this.setName(name);  
  6.     }  
  7.   
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     @Override  
  17.     public void beHit(BadBoy boy) {  
  18.         System.out.println("bigman " + this.getName() + "把" + boy.getName()  
  19.                 + "杀死了");  
  20.     }  
  21.   
  22. }  


test类: 
Java代码 
  1. public class CallBackTest {  
  2.     public static void main(String[] args) {  
  3.         BadBoy badboy = new BadBoy("Tom");  
  4.         Hitable child = new Child("Cat");  
  5.         Hitable bigman = new BigMan("Boris");  
  6.         badboy.hit(child);  
  7.         badboy.hit(bigman);  
  8.     }  
  9. }  


执行结果: 
Java代码 
  1. ----------------BEGIN----------------  
  2. badboy Tom打了Cat一拳  
  3. child Cat被Tom打哭了  
  4. -----------------END----------------  
  5. ----------------BEGIN----------------  
  6. badboy Tom打了Boris一拳  
  7. bigman Boris把Tom杀死了  
  8. -----------------END----------------  


这个例子可以看出,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。 
这个例子类似一个通知,在做取值传值的时候会很有用。 

例子2: 

根据上边例子再联想一个例子,A取数据要给B,A是一个不断在polling数据的对象,B是一个接口,A取到数据后调用B接口的b方法,并且把自己的引用传给B,告诉B,我已经取到了你要的数据,你自己来拿吧,到这里,A已经完成了任务。B的实现类会根据自己的不同实现,在从A取来数据后进行处理,可能是排序,可能是输出到文件,也可能是打印。 

例子2,证明了callback的另一个说法的概念:if you call me,I will call you back。