利用java的接口实现回调

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

onclick,onfocus,onload,oncreate......
我们在java GUI 编程、js事件、android组建中常常见到这些单词,这些函数就是回调函数。C语言利用指针实现回调,与面向对象的语言不同。我们这里介绍利用java的接口实现回调的方法。

回调是一种双向的调用模式,例如我们要调用B的一个特定的方法,B在执行完又要调用A的一个方法,而这个A(或者说A的这个方法)是由我们自己实现的。所以可以这样理解:“回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。”

不过,有了面向对象的机制后,我们就可以轻松地使用这套机制来实现回调了,让回调变得简单。

例子:

package com.yawn.callback;

/**
 * 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onFinish方法
 * A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new A()); // 初始化B并指定B所要回调的对象(方法)
		b.go();
	}
}

class A implements Finish{
	@Override
	public void onFinish() {
		System.out.println("finish");
	}
}
package com.yawn.callback;

/**
 * B的内部实现也很简单,只需要一个接口类型的成员变量(这个成员变量的具体实现由我们初始化B时指定),
 * 在执行方法完成时调用这个成员变量(接口对象)的onFinish方法即可
 * 
 * @author yawn
 *
 */
public class B {
	Finish f ;
	public B(Finish f){
		this.f = f;
	}
	void go(){
		System.out.println("Go go go!");
		if (f != null){
			f.onFinish();
		}
	}
}
package com.yawn.callback;

public interface Finish {
	void onFinish();
}

这样就可以在调用B的go方法之后又调用我们实现的onFinish方法了。

运行结果
Go go go!
finish

其实在初始化B时不一定要实现一个类A,也可以直接实现接口中的方法:

package com.yawn.callback;

/**
 * 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onClick方法
 * A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new Finish() {
			@Override
			public void onFinish() {
				System.out.println("finish");
			}
		});
		b.go();
	}
}

 

转载于:https://my.oschina.net/silenceyawen/blog/730494

你可能感兴趣的:(java,移动开发,python)