java 回調函數例子,及其原理,與代理模式的區別
回調函數
應用程序(application program)會時常通過api調用庫里所預先備好的函數。但是有些庫函數(library function)卻要求應用先傳給它一個函數,好在合適的時候調用,以完成目標任務。這個被傳入的、后又被調用的函數就稱為回調函數(callback function)。
作用: 可以把調用者與被調用者分開。調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。
例子
一個計算函數運行時間的工具類,正常方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/** * @auther: cpb * @date: 2019/1/17 16:32 * @description: */ public class runningtime { /** * 一個用來被測試的方法,進行了一個比較耗時的循環 */ public static void testmethod(){ for ( int i= 0 ; i< 100000000 ; i++){ } } /** * 一個簡單的測試方法執行時間的方法 */ public void testtime(){ long begin = system.currenttimemillis(); //測試起始時間 testmethod(); //測試方法 long end = system.currenttimemillis(); //測試結束時間 system.out.println( "[use time]:" + (end - begin)); //打印使用時間 } public static void main(string[] args) { runningtime test= new runningtime(); test.testtime(); } } |
創建回調函數接口
1
2
3
4
|
public interface callback { //執行回調操作的方法 void execute(); } |
回調函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/** * @auther: cpb * @date: 2019/1/17 16:35 * @description: */ public class tools { /** * 測試函數使用時間,通過定義callback接口的execute方法 * @param callback */ public void testtime(callback callback) { long begin = system.currenttimemillis(); //測試起始時間 callback.execute(); ///進行回調操作 long end = system.currenttimemillis(); //測試結束時間 system.out.println( "[use time]:" + (end - begin)); //打印使用時間 } public static void main(string[] args) { tools tool = new tools(); tool.testtime( new callback(){ //定義execute方法 public void execute(){ //這里可以加放一個或多個要測試運行時間的方法 runningtime.testmethod(); } }); } } |
為什么叫回調函數
我們觀看一下程序運行的流程,tools->callbacks->tools,顧為回調函數。
代理模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
//接口 public interface callback { //執行回調操作的方法 void execute(); } //實現類 public class mycallback implements callback{ @override public void execute() { mycallback.testmethod(); } public static void testmethod(){ for ( int i= 0 ; i< 100000000 ; i++){ } } } //代理類 public class proxy implements callback { private callback callback; public proxy(callback callback){ this .callback = callback; } @override public void execute() { callback.execute(); } } //調用方法類 public class tools { /** * 測試函數使用時間,通過定義callback接口的execute方法 * @param callback */ public void testtime(callback callback) { long begin = system.currenttimemillis(); //測試起始時間 callback.execute(); ///進行回調操作 long end = system.currenttimemillis(); //測試結束時間 system.out.println( "[use time]:" + (end - begin)); //打印使用時間 } public static void main(string[] args) { tools tool = new tools(); //讓代理去實現方法去調用方法 proxy proxy = new proxy( new mycallback()); tool.testtime(proxy); } } |
代理模式和回調函數的區別
- 代理模式需要創建接口實現類,并放入代理類中,隔離性更好,擴展性好
- 回調函數不需要創建接口實現類,編寫方便。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/c_royi/article/details/86528158