通過女朋友來通俗易懂講解“接口回調(diào)”,一不小心就被綠

@TOC

背景

最近要接一個數(shù)據(jù)禁悠,小松不知道怎么弄念祭,導(dǎo)師說:你可以定義一個接口回調(diào)啊

然后我就吭哧吭哧的寫,寫到一半碍侦,發(fā)現(xiàn)有點不對勁粱坤。頓時發(fā)現(xiàn)自己的接口回調(diào)用少了,只能對付常用的幾個場景瓷产,站玄。但是一旦在幾百萬代碼的產(chǎn)品中,很多接口回調(diào)都是自定義或者用別人的自定義的濒旦。

所以今天株旷,我們就好好的來剖析一下什么是接口回調(diào)

回調(diào)

假設(shè),現(xiàn)在小松有一個女朋友尔邓,小鹿晾剖,我們在一起生活,要生活呢就要洗碗梯嗽,如果我和她都學(xué)會洗碗齿尽,顯然,我們內(nèi)部的代碼是重復(fù)的灯节,我們都有一個洗碗的方法循头,這樣組成的家庭不好,理論上炎疆,只要有一個人會洗碗就夠了卡骂,另一個人去學(xué)別的東西。

現(xiàn)在小鹿會洗碗了形入,所以她的方法是這樣子

class littleLu {
    public void washUp(n){
        System.out.println("小鹿洗好了碗");
    }
}

小松作為一個居家好男人偿警,也不老是讓小鹿洗碗啊,但是自己不能去學(xué)習(xí)洗碗唯笙,不然代碼就重復(fù)了螟蒸,所以聰明的小松寫了一個辦法盒使,就是——"執(zhí)子之手,用來洗碗"
小松讓小鹿改變她的方法七嫌,只要把小松傳進去少办,小鹿就會用小松的手來洗碗

abstract class Person{
    private String name;
    private String hand;
    public String getHand() {
        return hand;
    }
}
class LittleLu extends Person{
    private String name="littleLu";
    private String hand="littleLu的手";
    public void washUp(Person person){
        System.out.println(person.getHand()+"洗好了碗");
    }
}

上面的代碼,首先定義一個人的抽象類诵原,只要是人英妓,都有名字還有手,再補一個獲得手的public方法绍赛,然后小鹿有一個洗碗的方法washUp蔓纠,只要把人傳進去,就可以讓這個人的手來洗碗

怎么做呢吗蚌?小松將自己當(dāng)做參數(shù)交給小鹿腿倚,然后小鹿用她的洗碗方法來洗就可以了(感覺有點奇怪,但是就是這個意思)

abstract class Person{...}
class LittleLu extends Person{...}
public class LittleSong extends Person{
    private String name="littleSong";
    private String hand="littleSong的手";

    public String getHand() {
        return hand;
    }

    public static void main(String[] args) {
        LittleLu littleLu=new LittleLu();
        LittleSong littleSong = new LittleSong();
        littleLu.washUp(littleSong);
    }
}

上面的main方法中蚯妇,小松把自己傳入到小鹿的washUp方法里面敷燎,小松不需要會洗碗,也能通過小鹿的方法來洗箩言。
打印結(jié)果

littleSong的手洗好了碗

此時硬贯,回調(diào)已經(jīng)產(chǎn)生了

  1. 注意看,在LittleSong這個類的main方法中陨收,new了一個littleLu饭豹,并且調(diào)用了littleLu的washUp方法,這個是一個調(diào)用务漩。
  2. 但是墨状,他在調(diào)用的同時也傳入了自己,使得washUp方法也可以拿到LittleSong對象菲饼,然后調(diào)用LittleSong中的getHand()方法將碗給洗了肾砂,如果這個步驟單獨看,他也是一個調(diào)用宏悦。

第一個步驟小松調(diào)用了小鹿的方法镐确,第二個步驟小鹿又反過來調(diào)用小松的方法

核心句子是這句:如果不好理解可以再看看上文的例子
A調(diào)用B的方法,傳入自己饼煞,然后B的方法拿到A后再調(diào)用A的方法干事情

這源葫,就是回調(diào)

回調(diào)的最大好處在于,雖然最終做事情的是A砖瞧,但是中途A需要某些東西息堂,只有B有,就像例子中的雖然需要小松來洗碗,但是小松不會荣堰,此時需要小鹿的方法來幫助小松洗碗床未。

你可能會問,為什么這么麻煩振坚?小松小鹿都學(xué)會洗碗不就好了嗎薇搁?
但是,此時只有兩個人渡八,假如說啃洋,小鹿又找了一個男朋友,那這個男朋友是不是也要學(xué)會洗碗呢屎鳍?如果小鹿有一群男朋友宏娄,外加包養(yǎng)幾個小鮮肉,豈不是每個人都要學(xué)會洗碗逮壁?
所以孵坚,有些方法,只能某個類有貌踏,雖然真正干事情的是A十饥,但是他不需要會干事情窟勃,只要提供自己的東西給會干事情的人干即可

比如工人不需要會蓋房子祖乳,只要把自己的力氣賣給包工頭就行,然后包工頭反過來調(diào)用他們的力氣去蓋房子

接口

講到這里可能有些人要噴我了秉氧,不是說好的接口回調(diào)嗎眷昆?接口呢?
這是一個循序漸進的過程汁咏,為什么需要接口亚斋?因為上面的方法雖然好,但是有很大的安全隱患H撂病帅刊!看main方法

public static void main(String[] args) {
        LittleLu littleLu=new LittleLu();
        LittleSong littleSong = new LittleSong();
        littleLu.washUp(littleSong);
}

小松只是為了洗個碗,卻把自己整個交給了小鹿漂问,小鹿豈不是可以對小松為所欲為赖瞒?計算機中,給的權(quán)限剛好足以蚤假,決不能多給栏饮,這是非常危險的,比如說littleSong的name就可以比littleLu獲取到磷仰。

此時接口就上場了袍嬉,一個接口,只需要聲明一個getHand方法,然后傳入到小鹿的washUp方法中的參數(shù)伺通,修改為這個接口即可箍土,我們來看看,我們之前都是繼承Person的泵殴,現(xiàn)在涮帘,將Person變成接口,只保留getHand方法

interface Person{
     String getHand();
}
class LittleLu implements Person{
    private String name="littleLu";
    private String hand="littleLu的手";
    public void washUp(Person person){
        System.out.println(person.getHand()+"洗好了碗");
    }
    @Override
    public String getHand() {
        return hand;
    }
}
public class LittleSong implements Person{
    private String name="littleSong";
    private String hand="littleSong的手";

    @Override
    public String getHand() {
        return hand;
    }
    public static void main(String[] args) {
        LittleLu littleLu=new LittleLu();
        LittleSong littleSong = new LittleSong();
        littleLu.washUp(littleSong);
    }
}

此時的打印結(jié)果依然還是原來的笑诅,但是看到了嗎调缨?在washUp方法中,傳入的是Person吆你,而Person里面弦叶,只有一個getHand方法,小鹿只能獲得getHand方法妇多,也就是說伤哺,就算是阿貓阿狗,只要你實現(xiàn)了Person接口者祖,有了getHand的方法立莉,小鹿也會,并且只會用你的手來洗碗七问。

這就是接口回調(diào)的核心要義蜓耻,
你調(diào)用我的方法,然后把你傳進去械巡,我的方法在那你調(diào)用你的方法干事情
你為了保護自己刹淌,僅僅把你實現(xiàn)的接口部分傳進去,我也只看接口部分的東西

女朋友也是程序員讥耗,希望她不要看到這篇文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末有勾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子古程,更是在濱河造成了極大的恐慌蔼卡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣磨,死亡現(xiàn)場離奇詭異雇逞,居然都是意外死亡,警方通過查閱死者的電腦和手機趋急,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門喝峦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呜达,你說我怎么就攤上這事谣蠢。” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵眉踱,是天一觀的道長挤忙。 經(jīng)常有香客問我,道長谈喳,這世上最難降的妖魔是什么册烈? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮婿禽,結(jié)果婚禮上赏僧,老公的妹妹穿的比我還像新娘。我一直安慰自己扭倾,他們只是感情好淀零,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膛壹,像睡著了一般驾中。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上模聋,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天肩民,我揣著相機與錄音,去河邊找鬼链方。 笑死持痰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侄柔。 我是一名探鬼主播共啃,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼占调,長吁一口氣:“原來是場噩夢啊……” “哼暂题!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起究珊,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤薪者,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剿涮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體言津,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年取试,在試婚紗的時候發(fā)現(xiàn)自己被綠了悬槽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞬浓,死狀恐怖初婆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤磅叛,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布屑咳,位于F島的核電站,受9級特大地震影響弊琴,放射性物質(zhì)發(fā)生泄漏兆龙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一敲董、第九天 我趴在偏房一處隱蔽的房頂上張望紫皇。 院中可真熱鬧,春花似錦腋寨、人聲如沸坝橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽计寇。三九已至,卻和暖如春脂倦,著一層夾襖步出監(jiān)牢的瞬間番宁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工赖阻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝶押,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓火欧,卻偏偏與公主長得像棋电,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苇侵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容