对callback,暂时的理解是:A对象调用B接口的b方法,b方法又反过来调用A对象中的c方法。
A调用B接口时把自身给B接口,至于怎么处理,由B的实现类去做,不关A的事。至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。
第二种理解:
第三种理解:
可能出现的问题:如果A的若干个执行方法中,要求响应对象不一致,尝试泛型是否可以解决!
实例理解:
package com.itm.CallBack; interface Hitable { /* 挨打的人的接口,他们有一个共同的方法, 就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来。 * */ public void beHit(BadBoy boy); public String getName(); public void setName(String name); }
package com.itm.CallBack; class BadBoy { String name; public BadBoy(String name) { this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } //打人 public void hit(Hitable hitable) { System.out.println("----------------BEGIN----------------"); System.out.println("badboy " + this.getName() + "打了" + hitable.getName() + "一拳"); hitable.beHit(this); System.out.println("-----------------END----------------"); } }
package com.itm.CallBack; /*Child:这个类实现了Hitable,小孩挨打了,反应是哭。。*/ class Child implements Hitable { String name; public Child(String name) { this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void beHit(BadBoy boy) { System.out.println("child " + this.getName() + "被" + boy.getName() + "打哭了"); } }
package com.itm.CallBack; /* * * BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。 * * * */ class BigMan implements Hitable { String name; public BigMan(String name) { this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void beHit(BadBoy boy) { System.out.println("bigman " + this.getName() + "把" + boy.getName() + "杀死了"); } }
package com.itm.CallBack; public class CallBackTest { public static void main(String[] args) { BadBoy badboy = new BadBoy("Tom"); Hitable child = new Child("Cat"); Hitable bigman = new BigMan("Boris"); badboy.hit(child); badboy.hit(bigman); } }
JAVA实现回调【摘抄,很经典】
熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。
Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。
Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。
例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:
public interface InterestingEvent { // 这只是一个普通的方法,可以接收参数、也可以返回值 public void interestingEvent(); }
class EventNotifier { private InterestingEvent ie; private boolean somethingHappened; public EventNotifier(InterestingEvent event) { ie = event; somethingHappened = false; } public void doWork() { if (somethingHappened) { // 事件发生时,通过调用接口的这个方法来通知 ie.interestingEvent(); } } }
public class CallMe implements InterestingEvent { private EventNotifier en; public CallMe() { // 新建一个事件通知者对象,并把自己传递给它 en = new EventNotifier(this); } // 实现事件发生时,实际处理事件的方法 public void interestingEvent() { // 这个事件发生了,进行处理 } }
interface InterestingEvent { public void interestingEvent(String event); }
class CallMe implements InterestingEvent { private String name; public CallMe(String name){ this.name = name; } public void interestingEvent(String event) { System.out.println(name + ":[" +event + "] happened"); } }
package com.itm.CallBack; import java.util.ArrayList; import java.util.List; class EventNotifier { private List<CallMe> callMes = new ArrayList<CallMe>(); public void regist(CallMe callMe){ callMes.add(callMe); } public void doWork(){ for(CallMe callMe: callMes) { // 事件触发了**** callMe.interestingEvent("sample event"); } } }
4. 测试
public class CallMeTest { public static void main(String[] args) { EventNotifier ren = new EventNotifier(); CallMe a = new CallMe("CallMe A"); CallMe b = new CallMe("CallMe B"); // regiest ren.regist(a); ren.regist(b); // test ren.doWork(); } }