产生接口回调的场景
产生接口回调的场景很简单,比如A叫B帮忙做一件事,交代完后A去忙别的事,然后B做完这件事之后会通知A,
通知A的这个动作就是接口回调的动作。
接口回调
接口回调的意义是通过接口来实现解耦的的前提下调用另一个类的方法,也就是B为A准备一个callback回调方法,然后B把任务丢给A,
A做完任务然后通过调用B的方法callback
#以下的解释如果不精通设计模式就不易理解,请配合代码一起看
传统情况下,B要调用A的方法,那么B和A就应该是组合关系或者聚合是组合关系,但这样耦合度就确实很高,如何解耦呢?创建一个
函数型接口Task里面只有一个抽象方法就是callback,然后将B作为Task接口实现类重写callback后,将task引用作为参数来完成解耦
1、通过Task接口完成解耦
public interface Task {
public void callback(String result);
}
2、定义Manger经理类,如下manager对象和employee对象就是聚合的关系,也就manager通过setter设置employee的值。同理,如果manager通过构造器来设置employee的值那就是组合关系,耦合度组合 > 聚合。
package com.sobot.demo4.callback;
public class Manager implements Task{
private Employee employee;
public void setEmployee(Employee employee) {
this.employee = employee;
}
public void doOther() {
System.out.println("项目经理去做别的了");
}
public void doOtherContinue() {
System.out.println("项目经理收到员工信息后继续去做别的了");
}
//这是整个小项目需要做的事
public void setTask(){
System.out.println("经理给员工布置任务");
doOther();
//员工完成经理布置的任务(含有回调方法)
employee.doTask(this);
doOtherContinue();
}
@Override
public void callback(String result) {
System.out.println("收到员工处理结果" +result);
}
}
3 真正解耦的是这里,这里没有出现任何的聚合或耦合关系原因是利用了多态的特征
package com.sobot.demo4.callback;
public class Employee {
public void doTask(Task task){
try {
System.out.println("Employee开始执行任务");
//模拟情景是员工完成任务花费了5秒钟
Thread.sleep(5000);
System.out.println("Employee处理完这项任务了");
//员工干完活后通知经理任务已完成
task.callback("finish");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4 测试
public class Client {
public static void main(String[] args) {
Employee employee = new Employee();
Manager manager = new Manager();
manager.setEmployee(employee);
manager.setTask();
}
}
最终结果
此案例体会出来的思想是不仅仅是回调,而是异步+回调,同步的思想就是项目经理必须等待员工做完任务才去干别的,异步就是经理把任务交给员工后立刻去做别的,员工完成任务就立马通知经理,经理处理完还是继续去做其它事;