講到回調函數這個概念給大家普及下
所謂回調函數
就是指這個函數先在某處注冊
而它將在稍後某個需要的時候被調用
比如在利用SDK 進行Windows編程的時候
我們需要注冊一個WNDCLASS類
這個類中有這樣一個參數lpfnWndProc
要進行消息處理
我們就要用處理消息的函數的指針給它賦值
消息處理函數什麼時候被調用的?我們沒有顯式地在程序中看到啊
是OS調用的
這是SDK的試驗方式
當然用的是過程式的語言C
可以通過傳遞函數的指針實現
C++中怎麼來實現呢?當然
C++兼容C
用函數指針就可以
同時C++又提供了面向對象的機制
可不可以有不同的實現機制呢?當然!STL 中的functor(Function object)就可以用到回調上
比如對一個存放int數據的vector進行遞減排序的話
我們可以這樣進行
sort(vec
begin()
vec
end()
greater<int>())
greater<int>()
就是我們傳遞的一個匿名對象
它重載了函數調用運算符
()
我們沒有顯式地調用這個對象裡面提供的函數
sort函數對對象裡面的函數進行call back
Java中要實現類似functor的功能
應該怎麼辦呢?Command模式可以幫上忙
Command模式看起來很簡單
只要把command封裝到一個接口中就可以
Command模式是回調機制的一個面向對象的替代品
比如java
io 中已經定義好的一個接口
public interface FilenameFilter {
boolean accept(File dir
String name)
}
這個FilenameFilter就是Command
實現Command的類就是ConcreteCommand
這個接口所聲明的操作
accept
就是看看目錄dir中的文件name是否滿足某種要求
如果滿足就返回true
否則就返回false
這個要求是什麼呢?你要對這個接口進行實現
比如我想看看這個文件的名稱包含不包含指定的字符串
那麼就可以定義下面的類
class DirFilter implements FilenameFilter {
private String afn;
public DirFilter(String afn){
this
afn = afn;
}
public boolean accept(File dir
String name){
String f = new File(name)
getName()
return f
indexOf(afn) !=
;
}
}
怎麼樣使用它呢?File類中有這樣一個方法
public String[] list(FilenameFilter filter)
因此
我們就可以這樣做了
File file = new File(
)
String[] list = file
list(new DirFilter(
wf
))
得到的list就是一個當然目錄中所有包含字符串
wf
的文件名稱的字符串數組
怎麼樣
看起來是不是和C++中的functor差不多呢?
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26476.html