Java中的functor實現(xiàn)
文章來源:csdn 作者:wangfengsdu
經常聽到回調函數(shù)(callback function)這個概念, 所謂回調函數(shù),就是指這個函數(shù)先在某處注冊,而它將在稍后某個需要的時候被調用。比如在利用SDK 進行Windows編程的時候,我們需要注冊一個WNDCLASS類,這個類中有這樣一個參數(shù) lpfnWndProc, 要進行消息處理,我們就要用處理消息的函數(shù)的指針給它賦值。消息處理函數(shù)什么時候被調用的?我們沒有顯式地在程序中看到啊。是OS調用的。 這是SDK的試驗方式,當然用的是過程式的語言C,可以通過傳遞函數(shù)的指針實現(xiàn)。
C++中怎么來實現(xiàn)呢?當然,C++兼容C,用函數(shù)指針就可以。 同時C++又提供了面向對象的機制,可不可以有不同的實現(xiàn)機制呢? 當然! STL 中的functor(Function object)就可以用到回調上。 比如對一個存放int數(shù)據(jù)的vector進行遞減排序的話,我們可以這樣進行。
sort(vec.begin(),vec.end(),greater<int>());
greater<int>()
就是我們傳遞的一個匿名對象,它重載了函數(shù)調用運算符“()”。我們沒有顯式地調用這個對象里面提供的函數(shù),sort函數(shù)對對象里面的函數(shù)進行call back。
Java中要實現(xiàn)類似functor的功能,應該怎么辦呢?Command模式可以幫上忙。Command模式看起來很簡單,只要把command封裝到一個接口中就可以。Command模式是回調機制的一個面向對象的替代品。
比如 java.io 中已經定義好的一個接口
public interface FilenameFilter {
boolean accept(File dir, String name);
}
這個FilenameFilter就是Command,實現(xiàn)Command的類就是ConcreteCommand。這個接口所聲明的操作 "accept" 就是看看目錄dir中的文件name是否滿足某種要求,如果滿足就返回true,否則就返回false。這個要求是什么呢?你要對這個接口進行實現(xiàn)。比如我想看看這個文件的名稱包含不包含指定的字符串,那么就可以定義下面的類:
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) != -1;
}
}
怎么樣使用它呢?File類中有這樣一個方法
public String[] list(FilenameFilter filter)
因此,我們就可以這樣做了:
File file = new File(".");
String[] list = file.list(new DirFilter("wf"));
得到的list就是一個當然目錄中所有包含字符串"wf"的文件名稱的字符串數(shù)組。怎么樣,看起來是不是和C++中的functor差不多呢?
欄 目:Java編程
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8525.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10Java Socket編程(三) 服務器Sockets
- 01-10Java進階:Struts多模塊的技巧
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java運行時多態(tài)性的實現(xiàn)
- 01-10Java經驗點滴:處理沒有被捕獲的異常
- 01-10Java Socket編程(四) 重復和并發(fā)服務器
- 01-10Java中的浮點數(shù)分析
- 01-10面向對象編程:Java中的抽象數(shù)據(jù)類型


閱讀排行
本欄相關
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機制詳解和調優(yōu)
- 01-10Java Socket編程(三) 服務器Sockets
- 01-10Java進階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運行時多態(tài)性的實現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java Socket編程(四) 重復和并發(fā)服務
- 01-10Java經驗點滴:處理沒有被捕獲的異常
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 04-02jquery與jsp,用jquery