首页 > 编程 > Java > 正文

Java的回调机制实例详解

2019-11-26 08:44:17
字体:
来源:转载
供稿:网友

本文实例讲述了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表