Java的回调机制实例详解

 更新时间:2019年08月08日 09:58:42   作者:cakincqm  
这篇文章主要介绍了Java的回调机制,结合实例形式详细分析了java回调机制相关原理、用法及操作注意事项,需要的朋友可以参考下

本文实例讲述了Java的回调机制。分享给大家供大家参考,具体如下:

一 代码

interface CallBack // 回调接口
{
  void methodToCallBack( );  //回调方法
}
class CallBackImpl implements CallBack   // 实现回调接口和回调方法
{
  public void methodToCallBack( )
  {
    System.out.println("I've been called back");
  }
}
public class Caller
{
  public void register(CallBack callback)   // 注册回调接口
  {
    callback.methodToCallBack( );      // 通过回调接口调用回调方法
  }
  public static void main(String[] args)
  {
    Caller caller = new Caller( );         //B处
    CallBack callBack = new CallBackImpl( );    //A处
    caller.register(callBack);           //C处
  }
}

二 运行

I've been called back

三 说明

回调机制的真正意图,就是实现控制反转,通过控制反转。对象在被创建的时候(如A处),由一个能够调控系统内所有对象的外界实体(如B处的caller),将其所依赖对象的引用传递给功能方法体(如C处的callBack,被送入到register)。

同一个接口,可以有不同的实现类,从而使得这些不同的实现类,可以定义众多不同的对象,而这些不同的对象会被按需注入功能方法块register。在被调用前,这些对象永远处于等待调用状态,直到有一天被回调。

四 代码

import java.awt.Rectangle;
interface Measurer
{
  // 这个anObject,并不明确。不明确的用意是,先不绑定任何特定的对象
  double measure( Object anObject );
}
// 把抽象的measure方法具体化
class AreaMeasurer implements Measurer
{
  public double measure(Object anObject)
  {
    // 把抽象的对象明确化,由于Object对象是所有对象的鼻祖,所以,它可以化身任何对象
    Rectangle aRectangle = (Rectangle) anObject;
    double area = aRectangle.getWidth() * aRectangle.getHeight();
    return area;
  }
}
class Car
{ 
  private double price;
  private double taxRate;
  
  Car(double price, double taxRate)
  {
    this.price = price;
    this.taxRate = taxRate;
  }
  public double getPrice()
  {
    return price;
  }
  public double getRate()
  {
    return taxRate;
  }
}
class CarMeasurer implements Measurer
{
 
  public double measure(Object anObject)
  {
    Car aCar = (Car) anObject;
    double totalPrice = aCar.getPrice() * (1 + aCar.getRate());
    return totalPrice;
  }
}
class Data
{
  public static double average(Object[] objects, Measurer meas)  // 前者提供数据,后者提供方法
  {
    double sum = 0.0;
    for (Object obj : objects)
    {
      sum = sum + meas.measure(obj);
    }
    if (objects.length > 0)
    {
      return sum / objects.length;
    } else {
      return 0;
    }
  }
}
public class callBackDemo
{
  public static void main(String[] args)
  {
    Measurer areaMeas = new AreaMeasurer();
    Rectangle[] rects = new Rectangle[]
    {
      new Rectangle(5, 10, 20, 30),
      new Rectangle(10, 20, 30, 40),
      new Rectangle(20, 30, 5, 15)
    };
    double averageArea = Data.average(rects, areaMeas);
    System.out.println("average area is: " + averageArea);
        
    Measurer carMeas = new CarMeasurer();
    Car[] cars = new Car[]
    {
      new Car(20000, 0.12),
      new Car(30000, 0.16),
      new Car(90000, 0.18),
    };
    double averagePrice = Data.average(cars, carMeas);
    System.out.println("average price is: " + averagePrice);
  }
}

五 运行

average area is: 625.0
average price is: 54466.666666666664

六 图解

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • 通过自定制LogManager实现程序完全自定义的logger

    通过自定制LogManager实现程序完全自定义的logger

    本章主要阐述怎么完全定制化LogManager来实现应用程序完全自定制的logger,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Springboot整合Redis实现超卖问题还原和流程分析(分布式锁)

    Springboot整合Redis实现超卖问题还原和流程分析(分布式锁)

    最近在研究超卖的项目,写一段简单正常的超卖逻辑代码,多个用户同时操作同一段数据出现问题,纠结该如何处理呢?下面小编给大家带来了Springboot整合Redis实现超卖问题还原和流程分析,感兴趣的朋友一起看看吧
    2021-10-10
  • 详解SpringMVC中的@RequestMapping注解

    详解SpringMVC中的@RequestMapping注解

    这篇文章主要介绍了SpringMVC中@RequestMapping注解,@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上,需要的朋友可以参考下
    2023-07-07
  • Spring整合Mybatis方式之注册映射器

    Spring整合Mybatis方式之注册映射器

    这篇文章主要介绍了Spring整合Mybatis方式之注册映射器,MapperFactoryBean注册映射器的最大问题,就是需要一个个注册所有的映射器,而实际上mybatis-spring提供了扫描包下所有映射器接口的方法,每种方式给大家介绍的非常详细,需要的朋友参考下吧
    2024-03-03
  • 详解hbase与hive数据同步

    详解hbase与hive数据同步

    这篇文章主要介绍了详解hbase与hive数据同步的相关资料,需要的朋友可以参考下
    2017-09-09
  • @JsonSerialize序列化注解的使用

    @JsonSerialize序列化注解的使用

    这篇文章主要介绍了@JsonSerialize序列化注解的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring Boot集成spring-boot-devtools开发时实现热部署的方式

    Spring Boot集成spring-boot-devtools开发时实现热部署的方式

    这篇文章主要介绍了Spring Boot集成spring-boot-devtools开发时实现热部署的方式,文中还给大家提到了spring boot 实现热部署的方式及集成注意事项,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • 如何利用jwt来保护你的接口服务

    如何利用jwt来保护你的接口服务

    项目软件要对外提供部分定制接口,为了保证软件数据的安全性,这篇文章主要给大家介绍了关于如何利用jwt来保护你的接口服务的相关资料,需要的朋友可以参考下
    2021-08-08
  • 详解Spring Kafka中关于Kafka的配置参数

    详解Spring Kafka中关于Kafka的配置参数

    这篇文章主要介绍了详解Spring Kafka中关于Kafka的配置参数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • servlet之session简介_动力节点Java学院整理

    servlet之session简介_动力节点Java学院整理

    这篇文章主要介绍了servlet之session简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论