java回調方法、鉤子方法以及模板方法模式

來源:互聯網
上載者:User

標籤:log   col   inter   多少   基礎   override   需求   pre   test   

在物件導向的語言中,回調則是通過介面或抽象類別來實現的,我們把實現這種介面的類稱為回調類,回調類的對象稱為回調對象,其處理事件的方法叫做回調方法。(摘自百度百科)

那麼通過上面那句話將百度百科中的“回呼函數”翻譯成JAVA版:回調方法就是一個通過回調對象的引用(java中的引用存的是對象的地址)調用的方法。如果你把

回調對象的引用(地址)作參數傳遞給另一個方法,當這個引用被用來調用其所指向的方法時,我們就說這是回調方法。回調方法不是由該方法的實現方直接調用,
而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

 

      下面我們來通過一個小需求來實現回調,需求為:王鋼蛋去餐廳打飯,餐廳服務員根據其飯量為其打飯。我們先構思下,首先要有個介面,介面中定義個抽象方法為飯量(回調介面);其次建立王鋼蛋(回調類),讓王鋼蛋實現這個介面,並想好其飯量(回調方法);最後建立餐廳,餐廳服務員(另一方)接待王鋼蛋(回調對象)並根據其提供的飯量(回調方法)打飯(特定事件,該事件會調用回調方法)。上代碼:

 

/** * 顧客,去食堂吃飯有個前提,要告訴服務員其飯量,才會給你盛飯 * @author coder * */interface Client{    /**     * 告訴服務員其飯量     * @return      */    public String appetite();}class WangGangDan implements Client{    @Override    public String appetite() {        return "一車米飯";    }}/***食堂*/class Restaurant{    /**     * 打飯方法,前提是客戶要告知服務員你的飯量,他會根據你的飯量給你“盛”飯     * @param client 排隊的客戶     * @return     */    public String dozenRice(Client client){        return "盛了"+client.appetite();    }}public class Test1 { //業務處理類,老王去打飯    public static void main(String[] args) {        WangGangDan laowang=new WangGangDan(); //王鋼蛋以別名laowang去食堂要飯        Restaurant waiter=new Restaurant();         String dozenRice=waiter.dozenRice(laowang);        System.out.println(dozenRice); //最後老王“盛了一車米飯”        //但是通常我們打飯時不會告訴服務員我們叫什麼,這樣太麻煩了,那麼可不可以只告訴服務員        //飯量多少就給我們打飯呢?按常理來說我們去餐廳也只會要一次飯。        //匿名內部類多用來實現回調,簡便        String dozenRice1=waiter.dozenRice(new Client(){             @Override            public String appetite() {                return "一鍋米飯";            }});        System.out.println(dozenRice1);     }}

         這裡將利用模板方法模式來說明鉤子方法是什麼,許多設計模式都用到了回調,鉤子之類的概念,這些基礎點理解了,有些模式也就不那麼晦澀難懂了,稍微改寫下上面的代碼就可以:

/** *  模板方法模式:在一個方法中定義一個演算法的骨架,而將一些步 *  驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情 *  況下,重新定義演算法中的某些步驟。 * 【鉤子方法】:原理就是實現為空白的方法,在某任務之前、之後、 *  執行中、報異常後調用的方法(是不是有種熟悉的感覺)。 *  通常鉤子方法是通過抽象類別或是本類中的空方法來實現的。 * */ abstract class Client{    /**     * 【模板方法】     */    public void templateMethod(){        before();        appetite();        after();    }    /**     * 【鉤子方法】在盛飯前(一個空的實現)     */     protected void before(){};    /**     * 【抽象方法】告訴服務員其飯量     * @return 飯量     */    public abstract void appetite();    /**     * 【具體方法】盛飯後     */    private void after(){        //實際項目這裡是共有的商務邏輯        System.out.println("拿筷子,找桌子,開吃...");    }}/** *食堂 */class Restaurant{    /**     * 打飯方法,前提是客戶要告知服務員你的飯量,他會根據你的飯量給你“盛”飯     * @param client 排隊的客戶     * @return     */    public void dozenRice(Client client){        client.templateMethod();    }}public class Test1 { //業務處理類,老王去打飯    public static void main(String[] args) {        Restaurant waiter=new Restaurant();        waiter.dozenRice(new Client(){            @Override            protected void before() {                System.out.println("對服務員吹鬍子瞪眼!!");            }            @Override            public void appetite() {                System.out.println("盛了一鍋米飯");            }});    }}

 

 

 

 

 

    

java回調方法、鉤子方法以及模板方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.