java回调机制实现

需求

需要外部类代为实现类本身实现不了的某个功能,并能让返回值在类内部进行处理。

基础部分

分析

将使用情况拆开来,分为以下几点:
- 需要外部类代为实现
- 返回值由类自行处理

需要满足以上两个功能,必须的条件为:
- 类中需要有方法来调用外部的类的方法
- 需要创建一个方法来处理外部的类返回的数据
- 为了让外部的类内调用到处理数据的方法,则需要将实例化好的对象传递给外部的类。

逻辑图

java回调机制实现_第1张图片

代码

结构图

这里写图片描述

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方法可以持续得调用

逻辑图

java回调机制实现_第2张图片

代码

结构图

这里写图片描述

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,则可以参照以下逻辑图来实现
java回调机制实现_第3张图片

你可能感兴趣的:(java)