Java的回調(diào)機制實例詳解
本文實例講述了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)用前,這些對象永遠(yuǎn)處于等待調(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相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
通過自定制LogManager實現(xiàn)程序完全自定義的logger
本章主要闡述怎么完全定制化LogManager來實現(xiàn)應(yīng)用程序完全自定制的logger,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Springboot整合Redis實現(xiàn)超賣問題還原和流程分析(分布式鎖)
最近在研究超賣的項目,寫一段簡單正常的超賣邏輯代碼,多個用戶同時操作同一段數(shù)據(jù)出現(xiàn)問題,糾結(jié)該如何處理呢?下面小編給大家?guī)砹薙pringboot整合Redis實現(xiàn)超賣問題還原和流程分析,感興趣的朋友一起看看吧2021-10-10
詳解SpringMVC中的@RequestMapping注解
這篇文章主要介紹了SpringMVC中@RequestMapping注解,@RequestMapping注解是一個用來處理請求地址映射的注解,可用于映射一個請求或一個方法,可以用在類或方法上,需要的朋友可以參考下2023-07-07
Spring Boot集成spring-boot-devtools開發(fā)時實現(xiàn)熱部署的方式
這篇文章主要介紹了Spring Boot集成spring-boot-devtools開發(fā)時實現(xiàn)熱部署的方式,文中還給大家提到了spring boot 實現(xiàn)熱部署的方式及集成注意事項,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)
這篇文章主要介紹了詳解Spring Kafka中關(guān)于Kafka的配置參數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
servlet之session簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了servlet之session簡介,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07

