关于Java回调机制的简单使用

 2024-01-28 01:04:54  阅读 0



我的项目中没有使用过回调机制,但是经常听人说要不要使用回调机制。 为了了解更多,我在网上阅读了一些博客文章; 我基本明白这是啥意思了。 有人说,这有点类似于策略模式。 我对这些设计模式了解不多,所以不做比较。 ,我只是单独对这个知识点做了一些记录,也对这两天的所见所闻做了一个小总结:

回调机制的本质是:A调用B中的方法b(); 在方法b中,调用A的方法a(); 而这个a就是回调方法:这里需要满足一些条件:

A 实现了一个接口,并且 a 方法由该接口定义。 A调用方法b时,必须传入自己的引用; 在方法b内部,方法a通过引用被调用。 这就是完整的回调机制。

这里我也用一个例子来进行说明:

例如:老板A想让秘书B订机票(方法b),他要忙着开会(A其他成员的方法),让她订好后告诉他航班的具体信息(方法一); 此时a方法就是一个回调函数。 具体代码如下:

public interface Callback {
    
    /**
        获取航班信息
     */
    public void getFeedBack();
}

public class Manager implements Callback {
    private Worker worker;  //获取B(秘书)的引用

    public Manager(Worker worker) {
        this.worker = worker;
        worker.doWork("整理公司文件",this); //这是B的方法,传入了A(老板)的引用
    }
    //回调方法
    public void getFeedBack() {
        System.out.println("事情已完成");
    }
}

public class Worker {
    /**
     * 业务参数+接口引用
     * @param str
     * @param callback
     */
    public void doWork(String str , Callback callback){
        if (str !=null){
            callback.getFeedBack();
        }
    }
}

测试类:

public class CallbackTest {
    public static void main(String[] args) {
        Worker worker = new Worker();
        Manager manager = new Manager(worker);

        manager.getFeedBack();
    }
}

这只是回调最基本的使用。 还可以看看异步回调,就是通过多线程来调用B的方法,这样A就可以继续做自己的其他事情,而不用等待B的方法完成。 可以看到如下代码:

/**
 * 这是一个回调接口
 * @author xiaanming
 *
 */
public interface CallBack {
	/**
	 * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数
	 * @param result 是答案
	 */
	public void solve(String result);
}

/**
 * 这个是小王
 * @author xiaanming
 * 实现了一个回调接口CallBack,相当于----->背景一
 */
public class Wang implements CallBack {
	/**
	 * 小李对象的引用
	 * 相当于----->背景二
	 */
	private Li li; 
	/**
	 * 小王的构造方法,持有小李的引用
	 * @param li
	 */
	public Wang(Li li){
		this.li = li;
	}
	
	/**
	 * 小王通过这个方法去问小李的问题
	 * @param question  就是小王要问的问题,1 + 1 = ?
	 */
	public void askQuestion(final String question){
		//这里用一个线程就是异步,
		new Thread(new Runnable() {
			@Override
			public void run() {
				/**
				 * 小王调用小李中的方法,在这里注册回调接口
				 * 这就相当于A类调用B的方法C
				 */
				li.executeMessage(Wang.this, question); 
			}
		}).start();
		
		//小网问完问题挂掉电话就去干其他的事情了,诳街去了
		play();
	}
	public void play(){
		System.out.println("我要逛街去了");
	}
	/**
	 * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法
	 */
	@Override
	public void solve(String result) {
		System.out.println("小李告诉小王的答案是--->" + result);
	}
	
}

/**

* 这是一个回调接口

*@

*/

{

/**

* 这是小李知道答案时调用的告诉小王的函数,也就是回调函数。

* @param 就是答案

*/

无效解决();

/**

*这是小王

*@

java中接口可以new吗_java接口可以new吗_java接口可以实现接口吗

* 实现了回调接口,相当于----->后台1

*/

王班{

/**

* 引用小丽对象

* 相当于----->背景2

*/

丽丽;

/**

* 小王的搭建方法有小李的参考

* @参数李

*/

王(丽丽){

这个.li = li;

/**

* 小王用这个方法向小李提问

* @param是小王想问的问题,1 + 1 = ?

*/

无效(最终){

//这里使用线程是异步的,

新(新(){

@

无效运行(){

/**

* 小王调用小李的方法,在这里注册回调接口

* 这相当于A类调用B的方法C

*/

java接口可以new吗_java接口可以实现接口吗_java中接口可以new吗

li.(王.this,);

})。开始();

//小王问完问题后,就挂了电话,去做其他事情了,作弊。

玩();

无效播放(){

.out.("我要去购物");

/**

* 小李知道答案后,调用这个方法告诉小王,也就是所谓的小王的回调方法

*/

@

无效解决(){

.out.("小李告诉小王的答案是 --->" + );

/**

* 这是小李

*@

*/

李类{

/**

* 相当于B类中的f(),带参数---->背景3

* @参数

* @param 小王提出的问题

*/

空白 ( , ) {

.out.("小王提问--->" + );

//模拟小李自己的事情需要很长时间

for(int i=0;我

/**

java接口可以new吗_java中接口可以new吗_java接口可以实现接口吗

* 小李做完自己的事情后,他认为答案是2

*/

= "答案是2";

/**

* 于是我给小王打电话,调用了小王的方法。

* 这相当于B类依次调用A的方法D

*/

。解决();

/**

* 测试类

*@

*/

类测试{

无效主([]参数){

/**

*新一点李

*/

li li = new Li();

/**

*新的小国王

*/

Wang wang = new Wang(li);

/**

* 小王问小李一个问题

*/

王.("1 + 1 = ?");

因此,基本用法先讲到这里,稍后会添加更深入的信息……

标签: 小王 回调 小李

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码