溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java的回調(diào)機制實例詳解

發(fā)布時間:2020-10-15 09:29:47 來源:腳本之家 閱讀:216 作者:cakincqm 欄目:編程語言

本文實例講述了Java的回調(diào)機制。分享給大家供大家參考,具體如下:

一 代碼

interface CallBack // 回調(diào)接口
{
  void methodToCallBack( );  //回調(diào)方法
}
class CallBackImpl implements CallBack   // 實現(xiàn)回調(diào)接口和回調(diào)方法
{
  public void methodToCallBack( )
  {
    System.out.println("I've been called back");
  }
}
public class Caller
{
  public void register(CallBack callback)   // 注冊回調(diào)接口
  {
    callback.methodToCallBack( );      // 通過回調(diào)接口調(diào)用回調(diào)方法
  }
  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

三 說明

回調(diào)機制的真正意圖,就是實現(xiàn)控制反轉(zhuǎn),通過控制反轉(zhuǎn)。對象在被創(chuàng)建的時候(如A處),由一個能夠調(diào)控系統(tǒng)內(nèi)所有對象的外界實體(如B處的caller),將其所依賴對象的引用傳遞給功能方法體(如C處的callBack,被送入到register)。

同一個接口,可以有不同的實現(xiàn)類,從而使得這些不同的實現(xiàn)類,可以定義眾多不同的對象,而這些不同的對象會被按需注入功能方法塊register。在被調(diào)用前,這些對象永遠處于等待調(diào)用狀態(tài),直到有一天被回調(diào)。

四 代碼

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)  // 前者提供數(shù)據(jù),后者提供方法
  {
    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的回調(diào)機制實例詳解

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設(shè)計有所幫助。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI