• JAVA回调机制


    转载博文:https://www.cnblogs.com/heshuchao/p/5376298.html

    回调机制

    就是A-》B-》A,就是A去调用B,B在结束的时候去调用A的某个方法,将结果返回给A;
    所以,A是调用方,B是提供方,B要给A制定规则,也就是提供接口,让A实现,在B内,去调用接口方法来统一回复结果

    回调大部分是和异步一起用的

    //B为A制定的接口规则
    1 public interface DoJob 2 { 3 public void fillBlank(int a, int b, int result);//A对result做加工处理 4 }
    //B的代码:
    public
    class SuperCalculator { public void add(int a, int b, DoJob customer) { int result = a + b;//B提供商提供的的核心功能 customer.fillBlank(a, b, result); } }
    //消费者A1
    public
    class Student { private String name = null; public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } //内部类 用来保护自己的隐私,比如 自己对接口的实现不想暴露出去 public class doHomeWork implements DoJob { @Override
         public void fillBlank(int a, int b, int result) { //这里去写,异步执行后的业务逻辑 System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
    //消费者A2
    public
    class Seller { private String name = null; public Seller(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doSell implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元"); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doSell()); } }

    上面示例表示学生(A1)/商人(A2) 都在使用超级计算器(B)的服务


    内部类的好处:

    1.如果回调的时候 需要用到Student里面的private成员,那么就要把这些你不想暴露的属性公开出来。内部类的好处是:可以访问外部类的私有成员;
    2.可以防止方法重名;

    假如我们不希望小明和老婆婆把fillBlank的功能直接暴漏给用户代码调用,那小明和老婆婆如果直接去实现doJob接口,势必要直接暴漏。那么用户代码不callHelp,而是直接调用fillBlank会怎样?
    假如上述情况正是你不希望看到的,那么我觉得用内部类这种方式,挺合适。而且小明的接口实现跟别人不同,那么他的内部类doHomeWork就可以有权不被别人“看到”。

  • 相关阅读:
    iOS常用第三方库之Masonry
    iOS超全面试题,面试前看一看,不错
    自学安卓练习作品单词APP(1)-安卓的hello word与有道字典防爬虫破解
    shrio的rememberMe不起作用
    上传组件uploadify在spring中返回406 / Not Acceptable 问题解决
    由max_allowed_packet引发的mysql攻防大战
    又到毕业季你为什么没有工作
    mavan下scala编译中文乱码的问题.以及内存溢出问题解决
    @RestController失效
    BeanInstantiationException: Failed to instantiate [java.time.LocalDateTime]
  • 原文地址:https://www.cnblogs.com/brxHqs/p/9566197.html
Copyright © 2020-2023  润新知