本人最近玩三国,就以三国里面的事例作为这个Java回调机制实例的背景。
话说,魏军来犯,刘备慌乱不已,幸好诸葛孔明出马,派出关羽张飞二人前去迎敌,临行前各交付锦囊一个予二人,吩咐两人按锦囊行事,两人依计行事,一个火攻,一个水淹,打败魏军。
这与回调有啥子关系呢?先讲讲啥米是回调吧:回调就是A定义处理逻辑,然后把控制权交由B(通过接口的方式,题外话,在C中是通过函数指针),等B在合适的时候调用之。联系到这个实例就是:诸葛孔明这书生上不了战场,但是脑子灵光,能制定有效的战斗策略(就是在啥米时候,啥米地方使用相应合适的战法)。而关张二人打仗猛,他们了解了诸葛村夫的作战计划,只要时机成熟,就执行之,那么就破敌在望。
闲话少讲,上代码:
1、声明接口(声明要执行的动作--进攻)
public interface Attackable { public void attack(); }
2、实现接口
第一个作战计划--火攻public class Package1 implements Attackable { public void attack() { System.out.println("火攻"); } }第二个作战计划--水淹public class Package2 implements Attackable { public void attack() { System.out.println("水淹"); } }
3、定义执行者(定义两队人马的头头要干嘛)
public class Team1Leader { public String name; public String position; Attackable attack; Team1Leader(String name,Attackable attack) { position = ""; this.name = name; this.attack = attack; } void action() { if(position.equalsIgnoreCase("树林")) attack.attack(); } } public class Team2Leader { public String name; public String position; Attackable attack; Team2Leader(String name,Attackable attack) { position = ""; this.name = name; this.attack = attack; } void action() { if(position.equalsIgnoreCase("河边")) attack.attack(); } }4、委托(孔明调兵遣将)public class KongMing { public static Team1Leader sheduleTeam1Leader() { return new Team1Leader("关羽",new Package1()); } public static Team2Leader sheduleTeam2Leader() { return new Team2Leader("张飞",new Package2()); } }5、主方法呗public class Main { public static void main(String[] args) { Team1Leader leader1 = KongMing.sheduleTeam1Leader(); Team2Leader leader2 = KongMing.sheduleTeam2Leader(); System.out.println("当未到达树林..."); leader1.action(); leader1.position = "树林"; System.out.print("当到达树林," + leader1.name); leader1.action(); System.out.println("当未到达河边..."); leader2.action(); leader2.position = "河边"; System.out.print("当到达河边," + leader2.name); leader2.action(); } }有同学可能会问,不用回调那么情况会点样呢......
那么通常使用的方法是轮询,也就是诸葛同学就只能马不停蹄的去两边问问关张二人就位没有,直到两人就位又或者是被关张砍个半死^_^。其实回调通常的编写习惯都是这样的:new Team3Leader("赵云",new Attackable() { public void attack() { System.out.println("落石"); } });所以当大家看到这些比较诡异的语句时候,通常就是回调出来作怪了。