接口回調和上轉型是設計模式的解耦核心,可以說幾乎所有的模式都是建立在這兩者的套用之上的。
基本介紹
- 中文名:接口回調
- 外文名:interface callback
概述,實例,
概述
接口回調其本質與上轉型是一樣的,不同的是:接口回調是用接口句柄來得到並調用實現這個接口的子類的引用;而上轉型則是用父類句柄來得到並調用繼承此父類的子類的引用。
實例
上面這段話看起來可能有點難以理解,那么下面以一段Java程式來作解釋:
接口:
public interface Father{
public void fatherFunc();
}
下面三個類都實現了上述接口:
public class SonA implements Father{
@override
public void fatherFunc(){
... ...//這裡是SonA自己對接口方法的實現
}
}
public class SonB implements Father{
@override
public void fatherFunc(){
... ...//這裡是SonB自己對接口方法的實現
}
}
public class SonC implements Father{
@override
public void fatherFunc(){
... ...//這裡是SonC自己對接口方法的實現
}
}
三個類都實現了共同的接口Father,但是對其中的方法實現可能會有所不同。構想一下:在某段事務處理中需要用到接口Father提供的功能(在本例中只有一個方法fatherFunc),可是又無法確定具體是需要哪個子類實現的fatherFunc方法,那么可以直接在事務中聲明接口Father的句柄,不用實例化。等到事務運行的時候再自動確定。看下面這段代碼:
public class Deal{
public void doSth(Father father){
father.fatherFunc();//此步驟需要用到接口Father的功能
... ...//處理其他事務
}
}
類Deal中用到了接口Father的功能,但是在定義時無法確定是哪一個實現Father的子類,直接使用了接口Father的句柄“Father father”,然後調用father的方法fatherFunc來處理,具體運行是再根據實例化對象調用相應的實現方法:
public static void main(String[] args){
Deal deal = new Deal();
Father fatherA = new SonA();
Father fatherB = new SonB();
Father fatherC = new SonC();
deal.doSth(fatherA);//調用的是SonA對接口的實現
deal.doSth(fatherB);//調用的是SonB對接口的實現
deal.doSth(fatherC);//調用的是SonC對接口的實現
}
這就達到了具體實現與事務處理的解耦。在類Deal處理事務過程中不需要知道實現接口的子類,這樣可以方便的擴充和維護代碼,即設計模式的開閉原則(對擴展開放,對修改關閉)。上面的代碼中,fatherA、fatherB、fatherC都可以稱為接口回調對象,它們雖然被聲明為接口Father類型,但是在實例化時卻是實現的某個子類。
上轉型和它類似,設計模式就是基於此種“解耦”方法來產生的各種不同套用結構。
類型對象的可比較涉及到接口回調的另一個例子:
一旦JAVA類實現了Comparable接口,其比較邏輯就已經確定;如果希望在排序操作中臨時指定比較規則,可以採用Comparator 接口回調的方式。