之前开发GUI的时候也使用了很多的事件监听器,不过当时都是不求甚解没有深入的探索其中的原理。最近在使用阿里云的应用配置管理(ACM)平台,通过JavaSDK调用。在封装ACM本地工具包时突然对回调函数产生了兴趣,故在本文总结回调函数的基本原理,如有差错还望指点。
首先我们创建监听器接口
package com.eiffel.callback;
/**
* 监听器接口
*
* @author eiffel
*
*/
public interface ConfigChangeListener {
/**
* 回调方法
*
* @param configInfo
*/
public void receiveConfigInfo(String configInfo);
}
创建自定义的监听借口实现类
package com.eiffel.callback;
/**
* 监听器实现类
*
* @author eiffel
*
*/
public class MyConfigListener implements ConfigChangeListener {
public void receiveConfigInfo(String configInfo) {
System.out.println("监听器接收到信号...");
System.out.println("接收到configInfo变更通知,configInfo变更后的内容是:" + configInfo);
}
}
创建监听器和configInfo管理类,该类中包含两个成员configChangeListener和configInfo。通过setConfigInfo变更信息,然后执行exexute()方法触发回调函数。
package com.eiffel.callback;
import java.util.ArrayList;
import java.util.List;
/**
* 监听器和configInfo管理类
*
* @author eiffel
*
*/
public class ConfigService {
// 监听器
private ConfigChangeListener configChangeListener = null;
// 被监听的信息,当信息发生变更后需要通知所有监听对象
private String configInfo;
public void setConfigInfo(String configInfo) {
this.configInfo = configInfo;
// configInfo内容变更,通知所有监听器更新configInfo
execute();
}
/**
* 注册监听器
*
* @param configChangeListener
*/
public void addListener(ConfigChangeListener configChangeListener) {
this.configChangeListener = configChangeListener;
}
/**
* 通知监听器更新configInfo
*/
public void execute() {
if (configChangeListener != null) {
configChangeListener.receiveConfigInfo(configInfo);
}
}
}
接下来是测试
package com.eiffel.callback;
/**
* 测试类
*
* @author eiffel
*
*/
public class MyTest {
public static void main(String[] args) {
/**
* 添加监听
*/
ConfigService service = new ConfigService();
service.addListener(new MyConfigListener());
/**
* 通过set方法变更configInfo
*/
service.setConfigInfo("hello,eiffel~");
}
}
测试结果:
在学习过程中发现回调函数和观察者模式大同小异,可以将监听器理解为观察者,configInfo理解成被观察对象.ConfigService来统筹大局,管理观察者和被观察对象。当被观察对象发生修改动作时(我们这里是setConfigInfo),则通知观察者他们的观察对象发生了修改,这里通知时调用的方法就是观察者(监听器)实现的回调方法。
查阅其他博文总结二者的差异:观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用。