接口回調

Java是一門面嚮對象語言,一切皆對象,因此在Java中不存在回調函數這一說法的。由於Java的一切皆對象性質,從而將回調函數這個特性提升到了接口回調。

接口回調是什麼?

接口回調:可以把使用某一接口的類創建的對象的引用賦給該接口聲明的接口變量,那麼該接口變量就可以調用被類實現的接口的方法。實際上,當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法,這一過程稱爲對象功能的接口回調。

從概念可以看出,接口回調是指一個使用過程,並強調是關於對象功能的使用過程,既然是功能,功能一般就對應着方法體(函數),因此它同樣滿足與回調函數相似的模型。

(1)接口的定義(裏面有方法)

(2)接口的實現 (類去實現這個接口)

(3)調用接口 

將(2)的引用(地址)傳遞給(3),然後(3)調用(2)中的方法,這一過程稱爲對象功能的接口回調。

如何使用接口回調?

接口回調,我將其分爲兩種方式,一種推模式,一種爲拉模式。

推模式

接口回調的推模式,指的是,甲方主動將其地址推送給調用者。比如下例:

接口:

public interface GasListener
{
    public void offerGas(String msg);
}
接口實現的甲方:
public class GasCompany implements GasListener
{   
    public void advertiseTo(IndoorsMan man)
    {
        System.out.println("煤氣公司:這是我們的聯繫方式,歡迎來電!");
        man.setListener(this);
    }
    @Override
    public void offerGas(String msg)
    {
        System.out.println("煤氣公司接收的訂單:"+msg);
    }
}
調用者: 
public class IndoorsMan 
{
    GasListener gListener;
    public void prepareCook()
    {
        System.out.println("宅男:準備下廚做幾個花式大菜!");
        System.out.println("宅男:進廚房,燒菜...");
        System.out.println("宅男:剛開火,就發現煤氣不足,沒辦法,只能打電話叫煤氣。");
        gListener.offerGas("宅男:送一瓶煤氣過來!");
    }   
    public void setListener(GasListener gListener)
    {
        this.gListener = gListener;
    }
}
測試: 
public class Test
{
    public static void main(String[] args)
    {
        IndoorsMan man = new IndoorsMan();
        GasCompany company = new GasCompany();
       
        company.advertiseTo(man);
        man.prepareCook();
    }           
}
GasCompany公司在打廣告時,就主動把自身信息告訴了IndoorsMan,當IndoorsMan發現煤氣不足這一事件發生時,IndoorsMan就根據接口的引用調用GasCompany服務。 
拉模式
接口回調的拉模式,指的是,調用者自己主動獲取甲方的信息。

調用者

public class IndoorsMan 
{
    GasListener gListener;
    public void prepareCook()
    {
        System.out.println("宅男:準備下廚做幾個花式大菜!");
        System.out.println("宅男:進廚房,燒菜...");
        System.out.println("宅男:剛開火,就發現煤氣不足,沒辦法,只能打電話叫煤氣。");
        gListener.offerGas("宅男:送一瓶煤氣過來!");
    }   
    public void setListener(GasListener gListener)
    {
        this.gListener = gListener;
    }
    public void configureGas()
    {
        // 主動獲取甲方信息
        setListener(new GasListener()
        {           
            @Override
            public void offerGas(String msg)
            {
                System.out.println("下單內容:"+msg);
            }
        });
    }   
}
測試
public class Test
{
    public static void main(String[] args)
    {
        IndoorsMan man = new IndoorsMan();
        man.configureGas();
        man.prepareCook();
    }           
}
再比如,使用線程Thread時,常常會在構建線程對象時,主動獲取Runnable接口的實現。
public class Test
{
    public static void main(String[] args)
    {
        Thread thread = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
           
            }
        });
    }           
}
 
擴展:
接口回調機制滿足觀察者設計模式,觀察者將自身地址註冊給被觀察者,當某一事件發生時,被觀察者根據註冊的地址調用相應的觀察者。

參考地址:http://blog.csdn.net/xiaanming/article/details/8703708

http://www.cnblogs.com/aoguren/p/5544865.html

http://www.importnew.com/19301.html

http://www.cnblogs.com/wangming007/p/5122701.html

http://blog.csdn.net/michael1112/article/details/53573830?locationNum=3&fps=1

http://blog.csdn.net/lvzishen123/article/details/50281667

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章