最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java接口回調(diào)和方法回調(diào)的簡單實(shí)現(xiàn)步驟

 更新時(shí)間:2025年03月05日 11:34:08   作者:AutismBtkrsr  
這篇文章主要介紹了Java接口回調(diào)和方法回調(diào)的相關(guān)資料,接口回調(diào)是一種設(shè)計(jì)模式,實(shí)現(xiàn)三方解耦,調(diào)用者提供接口實(shí)現(xiàn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

先來聊接口回調(diào)

接口回調(diào)

這是一種設(shè)計(jì)模式,我的理解:

共有三者:調(diào)用者,被調(diào)用者和接口方法

接口回調(diào)的核心在于:調(diào)用者只需要實(shí)現(xiàn)接口方法,而被調(diào)用者只需要在合適的時(shí)機(jī)反過來調(diào)用調(diào)用者實(shí)現(xiàn)的方法,通過第三者接口方法,實(shí)現(xiàn)了雙向解耦,調(diào)用者不關(guān)心被調(diào)用者,被調(diào)用者不關(guān)心調(diào)用者如何實(shí)現(xiàn)方法的。

回調(diào)的核心思想是:

  • 調(diào)用者(Caller) 提供一個(gè)實(shí)現(xiàn),交給 被調(diào)用者(Callee)。
  • 被調(diào)用者在適當(dāng)?shù)臅r(shí)機(jī),通過調(diào)用該實(shí)現(xiàn)來執(zhí)行相應(yīng)的邏輯。

"回調(diào)"的體現(xiàn)在于:正常都是調(diào)用者調(diào)用被調(diào)用者,而這里是被調(diào)用者主動(dòng)調(diào)用調(diào)用者

接口回調(diào)的實(shí)現(xiàn)步驟

1. 定義接口

  • 定義一個(gè)接口,其中包含需要被回調(diào)的方法。

2. 實(shí)現(xiàn)接口

  • 由調(diào)用者(Caller)實(shí)現(xiàn)這個(gè)接口,并提供具體的回調(diào)邏輯。

3. 注冊接口

  • 將實(shí)現(xiàn)接口的對象傳遞給被調(diào)用者(Callee)。

4. 在合適時(shí)機(jī)回調(diào)

  • 被調(diào)用者在需要時(shí)調(diào)用接口中的方法,觸發(fā)回調(diào)邏輯。

舉例理解

舉一個(gè)生活中的例子,比如點(diǎn)外賣

這涉及到三者關(guān)系:

  • app用戶(調(diào)用者)
  • 餓了么app(被調(diào)用者)
  • 聯(lián)系方式(接口方法實(shí)現(xiàn))
  • 【用戶】填寫了聯(lián)系方式,比如地址和手機(jī)號(hào)(實(shí)現(xiàn)接口方法)
  • 付款后,【餓了么】開始一系列操作(呼叫商家 ->呼叫騎手等)
  • 無論如何,最終送餐的時(shí)候必須知道如何聯(lián)系【用戶】,會(huì)調(diào)用實(shí)現(xiàn)的接口方法
  • 最終送到【用戶】手中

這個(gè)例子中,想想看,【用戶】作為調(diào)用者需要關(guān)心【餓了么】的一系列流程操作嗎?并不需要?!攫I了么】需要關(guān)心【用戶】的聯(lián)系方式嗎?呃。。。。好像的確挺關(guān)心的,這個(gè)例子翻車了?反正你能理解就行,聯(lián)系方式就算寫錯(cuò)成其他戶的地址,【餓了么】的騎手也會(huì)照樣送過去,這么看也不算關(guān)心內(nèi)容了。

代碼案例

寫一個(gè)簡單的代碼案例,加深理解

public interface ButtonClickListener {
    void click(); // 回調(diào)方法
}

public class Button {
    private ButtonClickListener listener;
    public void setButtonClickListener(ButtonClickListener listener){
        this.listener = listener;
    }
    public void click(){
        if (listener != null){
            listener.click(); // 回調(diào)接口方法
        }
    }
}

public class Main implements ButtonClickListener{
    public static void main(String[] args) {
        // 創(chuàng)建被調(diào)用者實(shí)例
        Button button = new Button();
        // 創(chuàng)建調(diào)用者(Main)實(shí)例
        Main main = new Main();
        // 注冊回調(diào)接口
        button.setButtonClickListener(main);
        // 模擬按鈕點(diǎn)擊
        button.click();
    }
    @Override
    public void click() {
        System.out.println("點(diǎn)擊按鈕");
    }
}

常見的接口回調(diào)

舉一個(gè)常用的Consumer接口經(jīng)常出現(xiàn)接口回調(diào)現(xiàn)象

關(guān)于Consumer接口可以看我另一篇博客:【Java】Java8的4個(gè)函數(shù)式接口簡單教程

Arrays.asList("a", "b", "c")
                .forEach(s -> System.out.println(s));

如上,這行代碼其實(shí)發(fā)生了隱式的接口回調(diào)

三者關(guān)系:

  • 我(調(diào)用者):我調(diào)用了集合的forEach()方法,并且我實(shí)現(xiàn)了Consumer接口的抽象方法accept()
  • forEach()(被調(diào)用者):forEach()方法會(huì)自動(dòng)調(diào)用我實(shí)現(xiàn)的accept()方法
  • Consumer.accept()(接口方法)

我只需要實(shí)現(xiàn)接口方法,forEach()會(huì)主動(dòng)調(diào)用我實(shí)現(xiàn)的方法,并不關(guān)心我到底咋實(shí)現(xiàn)的

異步回調(diào)

上面說的都是同步回調(diào)

  • 回調(diào)方法在調(diào)用的過程中立即被執(zhí)行。
  • 示例:按鈕點(diǎn)擊監(jiān)聽。

異步回調(diào)是:

  • 回調(diào)方法在調(diào)用結(jié)束后,異步地被執(zhí)行(通常是在另一個(gè)線程中)。
  • 示例:網(wǎng)絡(luò)請求完成后通知調(diào)用者。
// 異步回調(diào)示例(模擬異步任務(wù))
public class AsyncTask {

    // 定義回調(diào)接口
    public interface TaskCallback {
        void onTaskComplete(String result);
    }

    // 執(zhí)行異步任務(wù)
    public void execute(TaskCallback callback) {
        new Thread(() -> {
            try {
                Thread.sleep(2000);  // 模擬耗時(shí)任務(wù)
                String result = "Task Finished!";
                callback.onTaskComplete(result);  // 回調(diào)通知任務(wù)完成
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

// 調(diào)用者代碼
public class Main {
    public static void main(String[] args) {
        AsyncTask task = new AsyncTask();
        task.execute(result -> System.out.println("Callback received: " + result));
        System.out.println("Task started...");
    }
}

注意事項(xiàng)

空指針檢查

  • 如果沒有設(shè)置回調(diào)接口(即 listener 為 null),直接調(diào)用接口方法會(huì)拋出 NullPointerException。
if (listener != null) {
    listener.onClick();
}

線程安全

  • 在多線程場景下,注意回調(diào)接口的線程安全問題,例如異步任務(wù)回調(diào)需要在主線程中執(zhí)行。

性能開銷

  • 回調(diào)接口的調(diào)用會(huì)帶來一定的性能開銷,尤其是在高頻調(diào)用場景中,可能對性能產(chǎn)生影響。

強(qiáng)依賴問題

  • 如果接口實(shí)現(xiàn)的方式過于復(fù)雜,會(huì)導(dǎo)致代碼難以維護(hù),因此需要設(shè)計(jì)合理的接口和實(shí)現(xiàn)。

方法回調(diào)

差不多,看區(qū)別就行

核心記住一句話:將方法作為另一個(gè)方法的參數(shù)

方法回調(diào):

  • 調(diào)用者將某個(gè)對象的方法引用直接傳遞給被調(diào)用者,被調(diào)用者在適當(dāng)時(shí)機(jī)調(diào)用這個(gè)方法。
  • 不依賴接口,通常通過方法引用或 Lambda 表達(dá)式實(shí)現(xiàn)。
依賴接口不需要接口,直接傳遞方法引用需要接口,調(diào)用者實(shí)現(xiàn)接口并提供邏輯
靈活性不靈活,直接綁定到具體類的方法更靈活,支持不同實(shí)現(xiàn)類
解耦程度較低,調(diào)用者和被調(diào)用者直接關(guān)聯(lián)高度解耦,通過接口隔離調(diào)用者與實(shí)現(xiàn)者
復(fù)雜性簡單相對復(fù)雜,但更適合擴(kuò)展場景
  • 方法回調(diào):簡單直接調(diào)用具體類的方法,適用于調(diào)用單一方法的場景。
  • 接口回調(diào):強(qiáng)調(diào)解耦,適用于需要靈活多變的回調(diào)邏輯場景。

總結(jié)就行,區(qū)別不大,就是不用實(shí)現(xiàn)接口了

三者關(guān)系就變成,我調(diào)用forEach(),而forEach()調(diào)用了我寫的Caller.printMessage()方法

總結(jié)

到此這篇關(guān)于Java接口回調(diào)和方法回調(diào)的文章就介紹到這了,更多相關(guān)Java接口回調(diào)和方法回調(diào)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java源碼解析之object類

    Java源碼解析之object類

    前些天看到別人討論閱讀源碼有什么用這個(gè)問題,有一句話說的特別好:學(xué)習(xí)別人實(shí)現(xiàn)某個(gè)功能的設(shè)計(jì)思路,來提高自己的編程水平。本文主要介紹了Java源碼解析之object類,需要的朋友可以參考。
    2017-10-10
  • 詳解Java高階語法Volatile

    詳解Java高階語法Volatile

    這篇文章主要介紹了Java高階語法Volatile,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 淺談Java設(shè)計(jì)模式系列-裝飾器模式

    淺談Java設(shè)計(jì)模式系列-裝飾器模式

    這篇文章主要介紹了Java設(shè)計(jì)模式系列-裝飾器模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 阿里SpringBoot應(yīng)用自動(dòng)化部署實(shí)現(xiàn)IDEA版Jenkins

    阿里SpringBoot應(yīng)用自動(dòng)化部署實(shí)現(xiàn)IDEA版Jenkins

    這篇文章主要為大家介紹了阿里SpringBoot應(yīng)用自動(dòng)化部署實(shí)現(xiàn)IDEA版Jenkins過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Java中的鎖Lock和synchronized

    詳解Java中的鎖Lock和synchronized

    鎖是Java并發(fā)編程中最重要的同步機(jī)制,Java提供了種類豐富的鎖,每種鎖因其特性的不同,在適當(dāng)?shù)膱鼍跋履軌蛘宫F(xiàn)出非常高的效率。本文將詳細(xì)介紹Lock和synchronized
    2021-06-06
  • Sentinel 集成 Nacos 實(shí)現(xiàn)規(guī)則動(dòng)態(tài)推送與持久化的過程

    Sentinel 集成 Nacos 實(shí)現(xiàn)規(guī)則動(dòng)態(tài)推送與持久化的過程

    本文介紹了如何將Sentinel與Nacos集成,實(shí)現(xiàn)流量控制規(guī)則的動(dòng)態(tài)推送和持久化存儲(chǔ),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-02-02
  • Java Runtime類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java Runtime類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Runtime類封裝了運(yùn)行時(shí)的環(huán)境。每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。下面通過本文給大家分享Java Runtime類詳解,需要的朋友參考下吧
    2017-04-04
  • OpenFeign實(shí)現(xiàn)攜帶請求頭方案詳細(xì)介紹

    OpenFeign實(shí)現(xiàn)攜帶請求頭方案詳細(xì)介紹

    這篇文章主要介紹了OpenFeign實(shí)現(xiàn)攜帶請求頭方案,在通過???OpenFeign???進(jìn)行服務(wù)調(diào)用的過程中,我們需要將用戶的??user-token???、??lang??等信息放入請求header中。在分布式系統(tǒng)中,往往一個(gè)業(yè)務(wù)接口內(nèi)部會(huì)發(fā)生多次RPC調(diào)用
    2022-11-11
  • 最新SpringCloud?Stream消息驅(qū)動(dòng)講解

    最新SpringCloud?Stream消息驅(qū)動(dòng)講解

    SpringCloud Stream 是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架,通過 SpringCloud Stream 連接消息中間件,以實(shí)現(xiàn)消息事件驅(qū)動(dòng),這篇文章主要介紹了SpringCloud?Stream消息驅(qū)動(dòng),需要的朋友可以參考下
    2022-11-11
  • Java對象比較之equals與hashCode詳解

    Java對象比較之equals與hashCode詳解

    這篇文章主要介紹了Java對象比較之equals與hashCode詳解,equals?方法和?hashCode?方法是?Object?類中的兩個(gè)基礎(chǔ)方法,它們共同協(xié)作來判斷兩個(gè)對象是否相等,需要的朋友可以參考下
    2023-12-12

最新評論

河西区| 景洪市| 常山县| 大邑县| 昭觉县| 渝北区| 惠东县| 垦利县| 安图县| 大港区| 贞丰县| 南乐县| 漠河县| 加查县| 胶南市| 桓仁| 芦山县| 宁安市| 武定县| 青浦区| 连南| 石首市| 丰原市| 浦城县| 林芝县| 温州市| 和硕县| 全椒县| 万盛区| 喀喇| 启东市| 岳阳县| 海原县| 乡宁县| 上栗县| 海丰县| 汉中市| 二手房| 虎林市| 高青县| 汶上县|