接口回调目的:类似模板方法,将共性部分作为通用模板,将个性部分抽离出方法由子类个性化实现。
接口回调方式:将【接口I:包含由子类实现的个性化方法】作为【形参】组合到类B中,在类B中处理共性逻辑,其中会调用【接口I】的方法。当个性层的A类(相当于子类)调用B类的方法时,在入参部分就会需要通过匿名内部类个性化实现个性逻辑。
一、接口回调
模拟一个场景——值日,每个学生分配不同的星期范围值日,比如1-3,表示从周日到周二值日(我们以西方为准测试)。
定义一个学生类
public class Student {
/**
* 学号
*/
private Long id;
/**
* 姓名
*/
private String name;
/**
* 值班范围:1-2 表示 周日到周一该学生值班
*/
private String onDutyArea;
}
现在由管理员根据值班范围每周生成一个定时计划任务表,方便定时任务每天将当天的数据拿出,给对应的学生做提醒,那么我们就需要将这个值班日期范围拆解,形成一个定时任务计划表。
public class DutyRemindTask implements CallBackDuty{
/**
* 学生id
*/
private Long stuId;
/**
* 学生姓名
*/
private String name;
/**
* 值班日期:yyyy-MM-dd
*/
private String dutyDate;
}
此外,我们还需要向我们的学生提供值日明细,即按照id查询,获取都是哪几天值日。
public class DutyDetail {
/**
* 学生id
*/
private Long stuId;
/**
* 值班日期集合
*/
private Set<String> dutyDates;
}
我们就可以模拟数据并生成对应格式的数据
@Test
public void testCallBack() {
/*模拟数据*/
List<Student> students = Lists.newArrayList(
new Student(1L, "JACK", "1-3"),
new Student(2L, "JULY", "2-5"),
new Student(3L, "TOM", "4-5")
);
......数据处理过程见下图......
}
定时任务表 | 明细表 |
---|---|
![]() |
![]() |
//打印结果,西方的1表示周日
[{
"stuId":1,"name":"JACK","dutyDate":"2021-07-11"},{
"stuId":1,"name":"JACK","dutyDate":"2021-07-12"},{
"stuId":1,"name":"JACK","dutyDate":"2021-07-13"},{
"stuId":2,"name":"JULY","dutyDate":"2021-07-12"},{
"stuId":2,"name"