转载博文:https://www.cnblogs.com/heshuchao/p/5376298.html
回调机制:
就是A-》B-》A,就是A去调用B,B在结束的时候去调用A的某个方法,将结果返回给A;
所以,A是调用方,B是提供方,B要给A制定规则,也就是提供接口,让A实现,在B内,去调用接口方法来统一回复结果
回调大部分是和异步一起用的
//B为A制定的接口规则
1 public interface DoJob 2 { 3 public void fillBlank(int a, int b, int result);//A对result做加工处理 4 }
//B的代码:
public class SuperCalculator { public void add(int a, int b, DoJob customer) { int result = a + b;//B提供商提供的的核心功能 customer.fillBlank(a, b, result); } }
//消费者A1
public class Student { private String name = null; public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } //内部类 用来保护自己的隐私,比如 自己对接口的实现不想暴露出去 public class doHomeWork implements DoJob { @Override
public void fillBlank(int a, int b, int result) { //这里去写,异步执行后的业务逻辑 System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
//消费者A2
public class Seller { private String name = null; public Seller(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doSell implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元"); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doSell()); } }
上面示例表示学生(A1)/商人(A2) 都在使用超级计算器(B)的服务
内部类的好处:
1.如果回调的时候 需要用到Student里面的private成员,那么就要把这些你不想暴露的属性公开出来。内部类的好处是:可以访问外部类的私有成员;
2.可以防止方法重名;
假如我们不希望小明和老婆婆把fillBlank的功能直接暴漏给用户代码调用,那小明和老婆婆如果直接去实现doJob接口,势必要直接暴漏。那么用户代码不callHelp,而是直接调用fillBlank会怎样?
假如上述情况正是你不希望看到的,那么我觉得用内部类这种方式,挺合适。而且小明的接口实现跟别人不同,那么他的内部类doHomeWork就可以有权不被别人“看到”。