JAVA接口回調原理簡單實現(xiàn)

接口回調能實現(xiàn)的核心:接口對象可以被替換為實現(xiàn)這個接口的類的對象

//不會報錯
InterfaceA a;
a=new A();

回調一直是一個JAVA中很重要的概念朋凉,應用場景:
A.class需要使用B.class的方法,然后A還需要在B的方法執(zhí)行完畢后给梅,作出對應反應,即在B的方法中還需要回調到將它new出來的A的方法末购。
為了方便理解破喻,我們用到接口,做個簡單的demo:
學生做完了作業(yè)盟榴,需要找家長檢查,家長檢查學生的作業(yè)是否準確完成婴噩,如果完成了就告訴學生可以玩游戲了擎场,否則告訴學生繼續(xù)做作業(yè)。
第一步:建立學生接口:InterfaceStudent (家長可以通過這個接口來找到學生并告訴他需要做的事情)

public interface InterfaceStudent {
    void playGame();//學生可以玩游戲了
    void doHomework();//學生還要寫作業(yè)
}

第二步:建立學生類几莽,實現(xiàn)這個接口 并且實現(xiàn)方法CheckHomework()來請家長幫忙檢查作業(yè)

public class Student implements InterfaceStudent {
    public boolean isMyHomeworkFinishde;//判斷作業(yè)是否寫完
    private Parents mParents;//這個學生對應的家長
    Student(){//重寫構造方法 建立學生對象時 也 建立其對應家長對象
        mParents=new Parents(this);
    }
    void setMyHomeworkFinishde(boolean isMyHomeworkFinishde){
        this.isMyHomeworkFinishde=isMyHomeworkFinishde;
    }
    void CheckHomework(){//請家長來檢查作業(yè)
        mParents.check(this.isMyHomeworkFinishde);
    }
    @Override
    public void playGame() {
        System.out.println("可以打游戲了迅办!");
    }
    @Override
    public void doHomework() {
        System.out.println("繼續(xù)寫作業(yè)!");
    }
}

建立Parents.class來實現(xiàn)檢查作業(yè)的方法check()章蚣,并根據(jù)情況回調學生的玩游戲或者繼續(xù)寫作業(yè)方法

public class Parents {//家長 來判斷學生該做什么
    InterfaceStudent mStudent;//先通過接口建立家長對應的學生對象

    Parents(Student mStudent){//綁定家長和學生
        this.mStudent=mStudent;
    }
//檢查學生的作業(yè) 看看是否完成 并對學生作出相應指示
    public void check(boolean isMyHomeworkFinishde){
        if (isMyHomeworkFinishde){
            mStudent.playGame();
        }
        else{
            mStudent.doHomework();
        }
    };
}

最后就是Test類啦:

public class Test {
    public static void main(String[] args){
//A同學作業(yè)沒有完成讓家長檢查
        Student studentA=new Student();
        studentA.setMyHomeworkFinishde(false);
        studentA.CheckHomework();
//B同學作業(yè)完成讓家長檢查
        Student studentB=new Student();
        studentB.setMyHomeworkFinishde(true);
        studentB.CheckHomework();
    }
}

運行結果就這樣的啦:

繼續(xù)寫作業(yè)站欺!
可以打游戲了!
Process finished with exit code 0

以上就是比較好理解的“接口回調”了
看到這里,有些同學可能要問了:這不坑爹嗎矾策!這個InterfaceStudent接口起個毛用呀磷账!我直接在Parents里邊聲明Student對象 構造函數(shù)傳入學生對象不就好了嗎?如下:

//這種方式也是可行的 但不推薦 因為請家長檢查作業(yè)的不一定是學生
//比如我家的dog也實現(xiàn)了InterfaceStudent接口 請家長檢查作業(yè)呢 對吧
//android開發(fā)中 activity和fragment有時候會共用一個presenter
public class Parents {//家長 來判斷學生該做什么
    private Student mStudent;
    Parents(Student mStudent){
        this.mStudent=mStudent;
    }}

暴躁老哥稍安勿躁,以上例子其實是個非常簡單的示范贾虽,但至少還是是實現(xiàn)了回調這個機制呀逃糟。在以上做法中,加入接口反而讓代碼顯得多余蓬豁。但其實再大型項目中绰咽,這個接口的存在非常重要,因為項目中有多個家長和多個學生地粪,我們需要這個接口來統(tǒng)一規(guī)定學生和父母能做的事情取募,方便管理。(瞎機吧扯蟆技,這樣做的原因除了滿足一些特殊需求外矛辕,主要還是為了解耦)

那么接下來我們可以稍微擴展一下:
如果我們在原本的基礎上增加一個要求:學生在等待家長檢查作業(yè)的時候,可以先去吃飯付魔,那么是不是就需要開一個線程聊品,這個線程中家長去檢查作業(yè),學生自己去做自己的事情几苍,家長檢查完畢再作出反饋翻屈。這種方式叫做異步回調。
很簡單妻坝,只需要在學生請家長檢查作業(yè)的方法中加入一個線程就可以了:

    void CheckHomework(){//請家長來檢查作業(yè)
//異步請求
        new Thread(new Runnable() {
            @Override
            public void run() {
                mParents.check(isMyHomeworkFinishde);
            }
        }).start();
        this.doOther();
    }
    
    public void doOther(){
        System.out.println("我先去掃地啦伸眶!");
    }

運行結果:

我先去掃地啦厘贼!
我先去掃地啦圣拄!
繼續(xù)寫作業(yè)!
可以打游戲了岳掐!

Process finished with exit code 0

總結一下,以上的接口回調其實不規(guī)范
1.應該在main中建立parents對象串述,然后通過student構造函數(shù)賦值寞肖,我直接在構造函數(shù)中new了
2.parents傳入Student對象應該在check中添加Student形參衰腌,然后再賦值觅赊,或者單獨給一個方法給student賦值
因為parent也會有單獨的屬性事情要設置等待
以上都是代碼規(guī)范的問題,以后多多注意尤泽!
在android的開發(fā)中MVP架構大量使用了接口回調规脸,并且封裝的很好,要習慣這種解耦方式闹丐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末被因,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堕花,更是在濱河造成了極大的恐慌粥鞋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壕曼,死亡現(xiàn)場離奇詭異等浊,居然都是意外死亡,警方通過查閱死者的電腦和手機轧飞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門踪少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠涛,“玉大人兼犯,你說我怎么就攤上這事集漾【咂” “怎么了凌埂?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埃疫。 經常有香客問我栓霜,道長横蜒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任仅炊,我火速辦了婚禮澎蛛,結果婚禮上,老公的妹妹穿的比我還像新娘督勺。我一直安慰自己斤贰,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布瓷叫。 她就那樣靜靜地躺著送巡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骗爆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天煮寡,我揣著相機與錄音栅隐,去河邊找鬼。 笑死碗殷,一個胖子當著我的面吹牛薪前,可吹牛的內容都是我干的。 我是一名探鬼主播炭菌,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼娃兽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了投储?” 一聲冷哼從身側響起玛荞,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤勋眯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后客蹋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽江,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡岗屏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年这刷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似袁。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡叔营,死狀恐怖所宰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情仔粥,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站麦向,受9級特大地震影響,放射性物質發(fā)生泄漏诵竭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一沙郭、第九天 我趴在偏房一處隱蔽的房頂上張望裳朋。 院中可真熱鬧,春花似錦鲤嫡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惭缰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漱受,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虐先,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像腐芍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子设褐,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361