回顧介面回撥:Interface CallBack 兩種簡單小思維
阿新 • • 發佈:2019-02-14
今天又有一位高中同學,也可以算是剛接觸Java的朋友問我一些問題,然後問到了介面回撥,我就和他說明了,順便有點時間,隨手寫了出來,希望簡單的小案例能幫助到有需要的大家。
問題描述:
- 1.小王問小李問題;
- 2.小李一時回答不出來,需要計算
- 3.小王因為急著玩,問完就走了。
- 4.小李得出答案後就給小王答案。
寫法1- 介面單獨寫:
- 1.介面 :CallBack.java
//介面,誰設定誰/直接呼叫(選擇在哪執行)誰給出結果,誰實現誰得到結果。
public interface CallBack {
public void solve(String result);
}
- 2.Wang.java
//王得到答案
public class Wang implements CallBack {
Li li;
public Wang(Li li) {
this.li = li;
}
public void askQuestion(final int num) {
new Thread(new Runnable() {
@Override
public void run() {
li.executeMessage(Wang.this , num);
}
}).start();
//問完不管得到答案與否,馬上玩耍去了
goPlay();
}
private void goPlay() {
System.out.println("問完問題,答案未知,玩去了...");
}
@Override
public void solve(String result) {
System.out.println("得到了答案 : " + result);
}
}
- 3.Li.java
public class Li {
public void executeMessage(CallBack callBack, int num) {
System.out.println("小王的問題是: "+num);
//模擬辦事
int count = 0;
for (int i = 0; i < num; i++) {
if (i > 0 && i % 2 == 0) {
count++;
}
}
String reslut = "答案是"+count;
//得到答案,告訴小王
callBack.solve(reslut);
}
}
- Test.java
public class Test {
public static void main(String[] args) {
Wang wang = new Wang(new Li());
wang.askQuestion(1000);
}
}
列印結果:
問完問題,答案未知,玩去了...
小王的問題是: 1000
得到了答案 : 答案是499
寫法2-介面寫在類中:
- Wang.java
//王得到答案
public class Wang implements CallBack {
Li li;
public Wang(Li li) {
this.li = li;
}
public void askQuestion(final int num) {
//非同步
new Thread(new Runnable() {
@Override
public void run() {
//先設回撥,再到執行資訊方法。
li.setCallBack(new Li.CallBack() {
@Override
public void solve(String result) {
System.out.println("得到了答案 : " + result);
}
});
//才再到執行方法。
li.executeMessage(num);
}
}).start();
//問完就玩耍,非同步
goPlay();
}
private void goPlay() {
System.out.println("問完問題,答案未知,玩去了...");
}
- Li.java
public class Li {
//public void executeMessage(CallBack callBack, int num),寫在內部了,不用傳過來。
public void executeMessage(int num) {
System.out.println("小王的要求數字是: " + num);
//模擬辦事
int count = 0;
for (int i = 0; i < num; i++) {
if (i > 0 && i % 2 == 0) {
count++;
}
}
String reslut = "答案是" + count;
//介面方法在此執行:得到答案,告訴小王
callBack.solve(reslut);
}
//介面在內部寫
public interface CallBack {
void solve(String result);
}
private CallBack callBack;
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
}
- Test.java
public class Test {
public static void main(String[] args) {
Wang wang = new Wang(new Li());
wang.askQuestion(1000);
}
}
輸出結果:
問完問題,答案未知,玩去了...
小王的要求數字是: 1000
得到了答案 : 答案是499