天天看点

回调函数和接口回调的理解,有图更给力!

经常时候会用到各种回调,也会有人会问到我这个东东,今天这一篇文章,非常的简洁的能说明这个问题

先上张图

回调函数和接口回调的理解,有图更给力!

附上分析文档:

这里面以如下这个需求来理解和分析接口回调。

需求:老板的员工干活,但是老板不能时刻都在监控者员工干活的进度。那么就要求员工干完活以后,通知老板活干完了。

这也就要求老板,需要要接收员工通知的能力。那么这个能力有两种方式实现:

1.直接运用回调函数(实际上就普通的函数)

2.通过接口回调的模式

首先看第一个demo,理解什么是回调函数?

BOSS.java

public class Boss{
 public void excute() {
  System.out.println("收到了!!"+System.currentTimeMillis());
 }
}
//============================================
这里面的excute方法,实际上工人干完活以后通过boss的实例去调用的。
那么这里面有一个问题,这个方法和别的方法没有任何区别。唯一的区别
这个方法,如果是boss无故调用是没有意义的。
出现的目的就是为了工人干完活以后的回调。
//============================================
           

employee.java

public class Employee {
private Boss boss;
 //工人干活
public void doSome(){
  //1.开始干活了
  for(int i=0;i<10;i++){
   System.out.println("第"+i+"事情干完了");
  }
  //告诉老板干完了
  boss=new Boss();
  //活干完了,老板的接收消息的方法(回调方法被调用)
  boss.excute();
 }
}
           

Client.java

public class Client {

 public static void main(String[] args){
  Employee emp=new Employee();
  //开启控制对象的运行
  emp.doSome();
 }
}
           

上述这个例子,是最简单的回调函数的使用。在这个例子中可以看出回调函数,不过就是一个函数而已。 那么上面这个例子好像觉得不是那么高大上。

那么问题出在哪儿呢?

1.现在员工把活干完了,无论干完了什么样的活。最终回调了老板类的方法,执行的结果就只有一个,不

好定制化。这样的代码只能hardcode,实际开发中,应该尽量避免hardcode,才能使得程序更具有易扩

展性。

2.员工干完活,要告知老板。但是有一天如果需求增加了。不仅要告知老板,同时也也要告诉部门经理,

财务经理,总之需要就是有可能在不断的变化的。

这个时候,如果按照目前的这种写法就需要写一个manager类,在写一个回调方法。在主程序中,员工干

完活以后,同时要创建manager的类的对象。再次调用manager的回调方法。而且即使这样写了manager

类对象的方法调用,还是解决不了上述第一个问题进行解决。

更好的一种解决方式: 1.通过抽象类的方式。 2.通过接口的方式,实现回调。 CallBackInterface.java

public interface CallBackInterface {
	//接口中的回调的方法声明
	public void excute();
}
           
Boss.java
           
//这是接口回调方法的具体实现类
           
<pre name="code" class="java">public class Boss implements CallBackInterface{
	@Override
	public void excute() {
		System.out.println("Boss.excute()我被调用了");
	}
}
           
<pre name="code" class="java" style="font-size: 14px; line-height: 21px;">Emplyee.java
           
//会调用接口的类
           
<pre name="code" class="java">public class Emplyee {
	//声明回调接口
	private CallBackInterface backInterface;
	
	//注册回调接口
	public void setBackInterface(CallBackInterface backInterface) {
		this.backInterface = backInterface;
	}
	
	public void doSometh() {
		//开始做事情
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//事情做完后告诉老板
		backInterface.excute();
	}
}
           
<pre name="code" class="java" style="font-size: 14px; line-height: 21px;">MainActivity.java
           
//执行代码
           
<pre name="code" class="java">public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Emplyee emplyee = new Emplyee();
		//将回调 对象(上层对象)传入,注册
		emplyee.setBackInterface(new Boss());
		//开启控制对象的运行,执行回调
		emplyee.doSometh();
	}
}
           
<span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; line-height: 21px;">所以接口的回调比普通的函数的回调更为优化!</span>
           
上一篇: 元宵佳节
下一篇: SPI接口介绍