需求
需要外部类代为实现类本身实现不了的某个功能,并能让返回值在类内部进行处理。
基础部分
分析
将使用情况拆开来,分为以下几点:
- 需要外部类代为实现
- 返回值由类自行处理
需要满足以上两个功能,必须的条件为:
- 类中需要有方法来调用外部的类的方法
- 需要创建一个方法来处理外部的类返回的数据
- 为了让外部的类内调用到处理数据的方法,则需要将实例化好的对象传递给外部的类。
逻辑图
代码
结构图
class A
package callbackdemo;
public class A {
/**
* 调用B中的方法
* @param str
*/
public void methodA(){
B b = new B();
System.out.println("调用了A类中的A方法");
// 调用B的方法A的同时,将对象本身传递给B
b.methodA(this);
}
public void methodB(){
System.out.println("调用了A类中的B方法");
}
}
class B
package callbackdemo;
public class B {
public void methodA(A a) {
System.out.println("调用了B中的A方法");
// A方法中对对象A的B方法进行了调用(这个步骤就是回调)
a.methodB();
}
}
测试
测试代码
package callbackdemo;
public class T {
public static void main(String[] args) {
A a = new A();
a.methodA();
}
}
运行结果
拓展部分
分析
上述代码中存在以下两个问题:
- 耦合性太强,不好复用
- 如果B需要持续调用回调函数的话,一段时间之后就会无法调用
解决方式:
- 使用接口来解耦合
- 将回调方法写成静态内部类的形式,使B方法可以持续得调用
逻辑图
代码
结构图
interface CallBack
package callbackdemo;
public interface CallBack {
public void invoke();
}
class A
package callbackdemo;
public class A {
public static ACallBack ac;
/**
* 调用B中的方法
* @param str
*/
public void methodA(){
B b = new B();
System.out.println("调用了A类中的A方法");
ac = new ACallBack();
b.methodA(ac);
}
public static class ACallBack implements CallBack{
@Override
public void invoke() {
System.out.println("调用了A类中回调类的invoke方法");
}
}
}
class B
package callbackdemo;
import callbackdemo.A.ACallBack;
public class B {
public void methodA(ACallBack ac) {
System.out.println("调用了B中的A方法");
ac.invoke();
}
}
测试
测试代码
package callbackdemo;
public class T {
public static void main(String[] args) {
A a = new A();
a.methodA();
}
}
运行结果
另
改造之后,若有class C需要调用B中的方法Method A,则可以参照以下逻辑图来实现