回顾接口回调:Interface CallBack 两种简单小思维

      • 问题描述
        • 写法1- 接口单独写
        • 写法2-接口写在类中

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

你可能感兴趣的:(java)