前言
其实很多年前,做Android的时候就总结过回调,但那个时候总结的算是比较片面,导致时间长不写项目,都忘了,这次就写个更简单的总结。
回调的本质:对象引用的传递。(可以是普通对象,但一般时候会是接口,因为大部分时候方法里的内容需要实现的人自己编写)
什么时候需要用回调?
举个简单的例子:每次点击手机上的按钮,就会发生页面跳转。
页面是否跳转或者什么时候跳转,都取决于用户什么时候点击按钮。
类似于这样的情况就可以用回调,可以看得出这就是一个观察者模式。
简单案例
这里就简单写一下一个人只要不出意外他的生命周期有青年,中年,老年。不同的人,在不同的时期干的事情不同,因此回调函数用接口实现。
这里还是按照几年前的大概逻辑,写一个回调,就是写一个观察者模式,大概还是四个步骤:
- 找出被观察者,被观察者的特点就是事件的发生者(这里就是人,事件就是出生,因为人一出生正常就得经历大致三个生命周期)
- 定义观察者,就是定义一个接口,接口中的方法就是观察者感兴趣的事件(这里所说感兴趣的事情,就是三个生命周期,因为我们想知道不同的人,在不同的生命周期究竟干了什么事情)
- 在被观察者中保存观察者的引用(这就是把接口传入被观察者写的方法中)
- 事件发生的时候通知观察者(其实就是调用人出生的方法的时候,接口中的方法会自动调用)
- 代码如下:
接口类似于观察者
public interface LiftTime {
void youth(String name);
void middle_aged(String name);
void elder(String name);
}
回调的本质就是在被观察者中将观察者的引用对象传递到相应的方法中
public class People {
public void born(LiftTime liftTime, String name) {
liftTime.youth(name);
liftTime.middle_aged(name);
liftTime.elder(name);
}
}
事件发生的时候(这里就是人出生的时候)通知观察者(也就是触发生命周期的接口中的抽象方法),自动执行人的三个生命周期
public class TestPeople {
public static void main(String[] args) {
People people = new People();
String name = "Jack Ma";
people.born(new LiftTime() {
@Override
public void youth(String name) {
System.out.println(name + ":好好学习,天天向上");
}
@Override
public void middle_aged(String name) {
System.out.println(name + ":拥有世界五百强的公司");
}
@Override
public void elder(String name) {
System.out.println(name + ":游山玩水");
}
}, name);
}
}
- 结果:
Jack Ma:好好学习,天天向上
Jack Ma:拥有世界五百强的公司
Jack Ma:游山玩水
后记
这次也是因为要设计一个有关生命周期的案例,就做了一个demo测试一下,相信有一定编程经验的人看了上面的文章应该对回调有了一个较为清晰的理解。如果还有不是很清楚的请接着看下面的内容。
- 回调函数的概念
回调函数是指在编程中将一个函数作为参数传递给另一个函数,并在需要的时候被调用的编程模式。在Java中,回调函数通常通过接口来实现,将函数的定义和具体实现分离开来,进而提高代码的灵活性和可维护性。 - 回调函数的使用方法
- 定义接口
回调接口是一个含有回调方法定义的接口。在设计回调接口时,需根据具体的业务需求来确定回调方法的参数及返回值。
示例:
public interface Callback {
void onComplete(String result);
}
- 实现回调接口
实现回调接口的类必须提供回调方法的具体实现。在实现回调方法时,可以根据特定的业务逻辑来实现具体的操作。
public class CallbackImpl implements Callback {
@Override
public void onComplete(String result) {
System.out.println("回调函数执行完毕,结果为:" + result);
}
}
- 回调函数的调用
在需要的时候,将实现了回调接口的对象传递给调用者的方法中,当特定事件发生时,调用者将执行回调函数。
public class Caller {
public void execute(Callback callback) {
// 模拟执行某个操作
String result = "操作结果";
// 执行回调函数
callback.onComplete(result);
}
}
- 使用回调函数
在调用时,创建回调对象,并传递给调用者的方法,当特定事件发生时,回调函数即会被调用。
public class Main {
public static void main(String[] args) {
Caller caller = new Caller();
Callback callback = new CallbackImpl();
caller.execute(callback);
}
}
- 回调函数的应用场景
- 事件处理
当某个事件发生时,通过回调函数执行特定的操作,实现事件的处理和响应。 - 异步编程
在多线程或网络编程中,通过回调函数来通知主线程任务完成或获取结果,避免阻塞和提高程序的响应速度。 - 框架扩展
通过回调函数,可以让用户在框架的特定事件发生时自定义行为,实现个性化的功能扩展。
- 回调函数的优势
- 解耦性
通过回调函数,调用者和实现者之间的耦合度降低,更容易维护和扩展代码。 - 灵活性
可以根据实际需求,传入不同的回调函数实现,实现代码的定制化和扩展性。 - 可读性
将逻辑分离到回调函数中,可以增加代码的可读性和可维护性。 - 异常处理
回调函数可以通过异常捕获和处理,增加代码的健壮性
回调函数是Java中非常有用的编程模式,能够提高代码的灵活性和可扩展性。通过将一个函数作为参数传递给另一个函数,并在特定事件触发时被调用,实现了代码的解耦和扩展。回调函数的使用方法简单明了,通过定义回调接口和实现回调方法,并将回调对象传递给调用者的方法即可实现回调功能。在实际开发中,回调函数常用于事件处理、异步编程和框架扩展等方面,可以大大提升代码的质量和开发效率。希望本篇博客能帮助您理解和应用回调函数,从而提升Java编程技能和开发实力。