JAVA接口回调原理简单实现

2019-08-15  本文已影响0人  番茄tomato

接口回调能实现的核心:接口对象可以被替换为实现这个接口的类的对象

//不会报错
InterfaceA a;
a=new A();

回调一直是一个JAVA中很重要的概念,应用场景:
A.class需要使用B.class的方法,然后A还需要在B的方法执行完毕后,作出对应反应,即在B的方法中还需要回调到将它new出来的A的方法。
为了方便理解,我们用到接口,做个简单的demo:
学生做完了作业,需要找家长检查,家长检查学生的作业是否准确完成,如果完成了就告诉学生可以玩游戏了,否则告诉学生继续做作业。
第一步:建立学生接口:InterfaceStudent (家长可以通过这个接口来找到学生并告诉他需要做的事情)

public interface InterfaceStudent {
    void playGame();//学生可以玩游戏了
    void doHomework();//学生还要写作业
}

第二步:建立学生类,实现这个接口 并且实现方法CheckHomework()来请家长帮忙检查作业

public class Student implements InterfaceStudent {
    public boolean isMyHomeworkFinishde;//判断作业是否写完
    private Parents mParents;//这个学生对应的家长
    Student(){//重写构造方法 建立学生对象时 也 建立其对应家长对象
        mParents=new Parents(this);
    }
    void setMyHomeworkFinishde(boolean isMyHomeworkFinishde){
        this.isMyHomeworkFinishde=isMyHomeworkFinishde;
    }
    void CheckHomework(){//请家长来检查作业
        mParents.check(this.isMyHomeworkFinishde);
    }
    @Override
    public void playGame() {
        System.out.println("可以打游戏了!");
    }
    @Override
    public void doHomework() {
        System.out.println("继续写作业!");
    }
}

建立Parents.class来实现检查作业的方法check(),并根据情况回调学生的玩游戏或者继续写作业方法

public class Parents {//家长 来判断学生该做什么
    InterfaceStudent mStudent;//先通过接口建立家长对应的学生对象

    Parents(Student mStudent){//绑定家长和学生
        this.mStudent=mStudent;
    }
//检查学生的作业 看看是否完成 并对学生作出相应指示
    public void check(boolean isMyHomeworkFinishde){
        if (isMyHomeworkFinishde){
            mStudent.playGame();
        }
        else{
            mStudent.doHomework();
        }
    };
}

最后就是Test类啦:

public class Test {
    public static void main(String[] args){
//A同学作业没有完成让家长检查
        Student studentA=new Student();
        studentA.setMyHomeworkFinishde(false);
        studentA.CheckHomework();
//B同学作业完成让家长检查
        Student studentB=new Student();
        studentB.setMyHomeworkFinishde(true);
        studentB.CheckHomework();
    }
}

运行结果就这样的啦:

继续写作业!
可以打游戏了!
Process finished with exit code 0

以上就是比较好理解的“接口回调”了
看到这里,有些同学可能要问了:这不坑爹吗!这个InterfaceStudent接口起个毛用呀!我直接在Parents里边声明Student对象 构造函数传入学生对象不就好了吗?如下:

//这种方式也是可行的 但不推荐 因为请家长检查作业的不一定是学生
//比如我家的dog也实现了InterfaceStudent接口 请家长检查作业呢 对吧
//android开发中 activity和fragment有时候会共用一个presenter
public class Parents {//家长 来判断学生该做什么
    private Student mStudent;
    Parents(Student mStudent){
        this.mStudent=mStudent;
    }}

暴躁老哥稍安勿躁,以上例子其实是个非常简单的示范,但至少还是是实现了回调这个机制呀。在以上做法中,加入接口反而让代码显得多余。但其实再大型项目中,这个接口的存在非常重要,因为项目中有多个家长和多个学生,我们需要这个接口来统一规定学生和父母能做的事情,方便管理。(瞎机吧扯,这样做的原因除了满足一些特殊需求外,主要还是为了解耦)

那么接下来我们可以稍微扩展一下:
如果我们在原本的基础上增加一个要求:学生在等待家长检查作业的时候,可以先去吃饭,那么是不是就需要开一个线程,这个线程中家长去检查作业,学生自己去做自己的事情,家长检查完毕再作出反馈。这种方式叫做异步回调。
很简单,只需要在学生请家长检查作业的方法中加入一个线程就可以了:

    void CheckHomework(){//请家长来检查作业
//异步请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                mParents.check(isMyHomeworkFinishde);
            }
        }).start();
        this.doOther();
    }
    
    public void doOther(){
        System.out.println("我先去扫地啦!");
    }

运行结果:

我先去扫地啦!
我先去扫地啦!
继续写作业!
可以打游戏了!

Process finished with exit code 0

总结一下,以上的接口回调其实不规范
1.应该在main中建立parents对象,然后通过student构造函数赋值,我直接在构造函数中new了
2.parents传入Student对象应该在check中添加Student形参,然后再赋值,或者单独给一个方法给student赋值
因为parent也会有单独的属性事情要设置等待
以上都是代码规范的问题,以后多多注意!
在android的开发中MVP架构大量使用了接口回调,并且封装的很好,要习惯这种解耦方式。

上一篇 下一篇

猜你喜欢

热点阅读