1. 程式人生 > >回顧介面回撥:Interface CallBack 兩種簡單小思維

回顧介面回撥:Interface CallBack 兩種簡單小思維

今天又有一位高中同學,也可以算是剛接觸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