java回调机制实现

需求

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

基础部分

分析

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

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

逻辑图

逻辑图

代码

结构图

这里写图片描述

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,则可以参照以下逻辑图来实现
这里写图片描述

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo的心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值