Java 本身没有回调这一说,但是面向对象可以模拟出来。
1. 回调接口对象 ICommand
package com.git.Cmder; public interface ICommand { void execute(); // 1. Think in callback, void (*)pf() }
2. 回调对象关联哪些,这个就是 c 中的 pf 赋值
package com.git.Cmder; /* 将 command 和 receive 关联起来 */ public class ConcreteCommand implements ICommand { Receiver receiver; // // 1. Think in callback, func public void setReceiver(Receiver receiver) { this.receiver = receiver; // // 1. Think in callback , pf = func } public void execute() { receiver.action(); // 1. Think in callback, call func } }
3. 关联对象 pf 的具体实现
package com.git.Cmder; public class Receiver { public void action(){ // 1. Think in callback, func 的内容 /* 具体做的工作 */ System.out.println("Receiver Do."); } }
4. cb 的注册和调用封成一个对象 Invoker
package com.git.Cmder; /* 调用者, 业务接口层 */ public class Invoker { private ICommand iCommand; // 1. Think in callback, cb 的入口, register /* 这里传子类过来,就调用子类的方法 */ public void setiCommand(ICommand iCommand) { this.iCommand = iCommand; } // 1. Think in callback, cb 的入口, call public void action(){ iCommand.execute(); } }
5. 测试
package com.git.Cmder; public class Client { public static void main(String[] args) { Receiver receiver = new Receiver(); // 真实的工作者 ConcreteCommand command = new ConcreteCommand(); // 2, 这里主要用的是 子类实现,调用子类的方法,接口定义的是父类,这样所有的子类都可以用了 command.setReceiver(receiver); // 2.1 Invoker invoker = new Invoker(); // 1 invoker.setiCommand(command); // 1.1 invoker.action(); } }
这里主要用父子类的关系来实现,定义一个cb 对象,对象包含一个父类接口对象,和"父类接口对象的调用", 用语言本身的提供的多态特性(其实内存中的地址还是一个), 不同的子类有不同的实现, cb 对象可以看做 n 个方法的管理者,当你传入一个子对象,调用其方法,说了半天还是一个 key-val ,只不过管理者由程序员自己来管理了。