程式設計思想基本概念之回撥(Callback)

鍾超發表於2011-10-18

在軟體模組呼叫中,主要有三種機制:同步呼叫,非同步呼叫和回撥。

同步呼叫是呼叫方(A)call被呼叫方(B)的介面,並等待B處理完給出一個回執後A才繼續執行,這期間是“阻塞”的。

非同步呼叫是呼叫方(A)call被呼叫方(B)的介面後,不等待B執行完,且B在被呼叫後會直接回執A。

回撥是呼叫方(A)call被呼叫方(B)時,B也回撥(callback)被呼叫方,雙方互調介面,只不過call動作是由A發起的。

同步呼叫是最簡單的,非同步呼叫一般是在回撥的基礎上實現的。所以瞭解“回撥”的機制是至關重要的。各位朋友請看下面的程式碼。

(注:以下示例用Java語言實現,在C,C++或Pascal等語言中也有相應的方式實現。)


package callbackexample;
public interface ICallBack
{
	//需要回撥的方法
	public void postExec();
}


上面就是一個介面類(抽象類,abstract class),他需要在呼叫方處被實現為一個匿名類。其中的postExec就是回撥方法。


package callbackexample;
package callbackexample;
public class FooBar 
{
	//組合聚合原則 
	private ICallBack callBack;
	public void setCallBack(ICallBack callBack)
	{
		this.callBack = callBack;
		doSth();
	}
	public void doSth()
	{
		callBack.postExec(); 
	}
}


上面是一個被呼叫的類,其中的setCallBack方法是被呼叫的方法。


package callbackexample;
//第二個類在測試類裡面,是一個匿名類:
package callbackexample;
public class Test
{
	public static void main(String[] args)
	{
		FooBar foo = new FooBar();
		foo.setCallBack(new ICallBack(){
			public void postExec()
			{
				System.out.println("在Test類中實現但不能被Test的物件引用,而由FooBar物件呼叫");
			}
		});
	}
}


上面的Test就是一個用於測試的呼叫者類,它通過main方法中例項化一個FooBar,並用實現的ICallBack的匿名類作為引數傳遞給FooBar的被呼叫方法setCallBack,而在這個虛擬方法中,FooBar呼叫了匿名類的匿名類的postExec方法的動作,這個動作就是回撥(Callback)。


相關文章