Java的回調(diào)機(jī)制實(shí)例詳解
本文實(shí)例講述了Java的回調(diào)機(jī)制。分享給大家供大家參考,具體如下:
一 代碼
interface CallBack // 回調(diào)接口
{
void methodToCallBack( ); //回調(diào)方法
}
class CallBackImpl implements CallBack // 實(shí)現(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) // 注冊(cè)回調(diào)接口
{
callback.methodToCallBack( ); // 通過(guò)回調(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處
}
}
二 運(yùn)行
I've been called back
三 說(shuō)明
回調(diào)機(jī)制的真正意圖,就是實(shí)現(xiàn)控制反轉(zhuǎn),通過(guò)控制反轉(zhuǎn)。對(duì)象在被創(chuàng)建的時(shí)候(如A處),由一個(gè)能夠調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體(如B處的caller),將其所依賴對(duì)象的引用傳遞給功能方法體(如C處的callBack,被送入到register)。
同一個(gè)接口,可以有不同的實(shí)現(xiàn)類,從而使得這些不同的實(shí)現(xiàn)類,可以定義眾多不同的對(duì)象,而這些不同的對(duì)象會(huì)被按需注入功能方法塊register。在被調(diào)用前,這些對(duì)象永遠(yuǎn)處于等待調(diào)用狀態(tài),直到有一天被回調(diào)。
四 代碼
import java.awt.Rectangle;
interface Measurer
{
// 這個(gè)anObject,并不明確。不明確的用意是,先不綁定任何特定的對(duì)象
double measure( Object anObject );
}
// 把抽象的measure方法具體化
class AreaMeasurer implements Measurer
{
public double measure(Object anObject)
{
// 把抽象的對(duì)象明確化,由于Object對(duì)象是所有對(duì)象的鼻祖,所以,它可以化身任何對(duì)象
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);
}
}
五 運(yùn)行
average area is: 625.0
average price is: 54466.666666666664
六 圖解

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
springboot bean循環(huán)依賴實(shí)現(xiàn)以及源碼分析
最近在使用Springboot做項(xiàng)目的時(shí)候,遇到了一個(gè)循環(huán)依賴的 問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于springboot bean循環(huán)依賴實(shí)現(xiàn)以及源碼分析的相關(guān)資料,需要的朋友可以參考下2021-06-06
Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法
平時(shí)對(duì)接口時(shí),經(jīng)常遇到j(luò)son字符串和map對(duì)象之間的交互,這篇文章主要給大家介紹了關(guān)于Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
MyBatis編寫(xiě)一個(gè)簡(jiǎn)單的SQL生成工具
MyBatis 是一個(gè)強(qiáng)大的數(shù)據(jù)持久化框架,它提供了一種半自動(dòng)化的 ORM 實(shí)現(xiàn)方式,本文將為大家介紹如何使用MyBatis編寫(xiě)一個(gè)簡(jiǎn)單的SQL生成工具,需要的可以了解下2025-03-03
Java實(shí)現(xiàn)獲取行政區(qū)劃的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)獲取行政區(qū)劃的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)游戲2023-03-03
Java instanceof關(guān)鍵字的的進(jìn)一步理解
這篇文章主要介紹了Java instanceof關(guān)鍵字的的進(jìn)一步理解,本文用一些實(shí)例講解了instanceof操作符的一些知識(shí),需要的朋友可以參考下2015-03-03
Java的函數(shù)式接口@FunctionalInterface的使用說(shuō)明
這篇文章主要介紹了Java的函數(shù)式接口@FunctionalInterface的使用說(shuō)明,我們常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解,需要的朋友可以參考下2024-01-01
java中File類的三種創(chuàng)建文件夾方法總結(jié)
這篇文章主要給大家介紹了關(guān)于java中File類的三種創(chuàng)建文件夾方法,File類代表文件或目錄路徑名的抽象表達(dá)形式,通過(guò)File類提供的方法,我們可以很方便地創(chuàng)建文件夾,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
SpringBoot+MyBatis-Plus+Velocity實(shí)現(xiàn)代碼自動(dòng)生成
本文主要介紹了使用SpringBoot、MyBatis-Plus和Velocity模板引擎實(shí)現(xiàn)代碼自動(dòng)生成器,該生成器能夠根據(jù)數(shù)據(jù)庫(kù)表結(jié)構(gòu)自動(dòng)生成增刪改查操作的代碼,感興趣的可以了解一下2025-03-03
Java實(shí)現(xiàn)添加,讀取和刪除Excel圖片的方法詳解
本文介紹在Java程序中如何添加圖片到excel表格,以及如何讀取、刪除excel表格中已有的圖片。文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-05-05

