Java SE之旅_10_回調函數

使用apache的開源工具dbutils時, 我們可以用QueryRunner很方便地進行數據庫查詢操作,將查到的數據封裝到JavaBean對象中, 或是封裝到存儲多個JavaBean對象的集合框架中. 其中用到的一個重要接口是ResultHandler, 該接口是如何實現對JavaBean對象的封裝的呢? 其原理其實是利用回調函數來完成的.


下面通過一個小例子展示一下如何使用回調函數.

1. 首先定義接口(該接口使用了泛型):

/**
 * 定義回調規範
 */
interface IHandler<T>{
	 T sayHi(String sql);
}

2. 再定義調用類, 其query方法接收一個實現了IHandler接口的對象, 在query方法體內調用IHandler的sayHi方法:

/**
 * 定義調用類
 */
class MyRunner {
	public <T>T query(String sql,IHandler<T> h){
		return h.sayHi(sql);
	}
}

3, 測試如何使用回調函數:

public class CallBackMethodDemo {

	/**
	 * 回調函數例子
	 */
	public static void main(String[] args) {
		MyRunner run = new MyRunner();
	    List<Map<String, Object>> list = run.query("yueyayun...",new IHandler<List<Map<String,Object>>>(){

			@Override
			public List<Map<String, Object>> sayHi(String sql) {
				Map<String,Object> map = new HashMap<String, Object>();
				map.put(sql, map);
				List<Map<String,Object>> ll = new LinkedList<Map<String,Object>>();
				ll.add(map);
				ll.add(new HashMap<String, Object>());
				return ll;
			}
			
		});
		System.out.println(list);
	}
}
 

從以上代碼可以看到, 我們可以寫多個實現了IHandler接口的具體類來完成各種的豐富功能, 在調用run.query方法時指定一個完成某項功能的IHandler接口實現類, 達到完成類似ResultHandler的效果.

建議有興趣的同學看看apache的dbutils工具的源碼, 它將有助於你深刻理解回調函數.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章