Java中的functor實(shí)現(xiàn)
經(jīng)常聽到回調(diào)函數(shù)(callback function)這個(gè)概念, 所謂回調(diào)函數(shù),就是指這個(gè)函數(shù)先在某處注冊(cè),而它將在稍后某個(gè)需要的時(shí)候被調(diào)用。比如在利用SDK 進(jìn)行Windows編程的時(shí)候,我們需要注冊(cè)一個(gè)WNDCLASS類,這個(gè)類中有這樣一個(gè)參數(shù) lpfnWndProc, 要進(jìn)行消息處理,我們就要用處理消息的函數(shù)的指針給它賦值。消息處理函數(shù)什么時(shí)候被調(diào)用的?我們沒有顯式地在程序中看到啊。是OS調(diào)用的。 這是SDK的試驗(yàn)方式,當(dāng)然用的是過程式的語(yǔ)言C,可以通過傳遞函數(shù)的指針實(shí)現(xiàn)。
C++中怎么來實(shí)現(xiàn)呢?當(dāng)然,C++兼容C,用函數(shù)指針就可以。 同時(shí)C++又提供了面向?qū)ο蟮臋C(jī)制,可不可以有不同的實(shí)現(xiàn)機(jī)制呢? 當(dāng)然! STL 中的functor(Function object)就可以用到回調(diào)上。 比如對(duì)一個(gè)存放int數(shù)據(jù)的vector進(jìn)行遞減排序的話,我們可以這樣進(jìn)行。
sort(vec.begin(),vec.end(),greater<int>());
greater<int>()
就是我們傳遞的一個(gè)匿名對(duì)象,它重載了函數(shù)調(diào)用運(yùn)算符“()”。我們沒有顯式地調(diào)用這個(gè)對(duì)象里面提供的函數(shù),sort函數(shù)對(duì)對(duì)象里面的函數(shù)進(jìn)行call back。
Java中要實(shí)現(xiàn)類似functor的功能,應(yīng)該怎么辦呢?Command模式可以幫上忙。Command模式看起來很簡(jiǎn)單,只要把command封裝到一個(gè)接口中就可以。Command模式是回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲贰?/p>
比如 java.io 中已經(jīng)定義好的一個(gè)接口
public interface FilenameFilter {
boolean accept(File dir, String name);
}
這個(gè)FilenameFilter就是Command,實(shí)現(xiàn)Command的類就是ConcreteCommand。這個(gè)接口所聲明的操作 "accept" 就是看看目錄dir中的文件name是否滿足某種要求,如果滿足就返回true,否則就返回false。這個(gè)要求是什么呢?你要對(duì)這個(gè)接口進(jìn)行實(shí)現(xiàn)。比如我想看看這個(gè)文件的名稱包含不包含指定的字符串,那么就可以定義下面的類:
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類中有這樣一個(gè)方法
public String[] list(FilenameFilter filter)
因此,我們就可以這樣做了:
File file = new File(".");
String[] list = file.list(new DirFilter("wf"));
得到的list就是一個(gè)當(dāng)然目錄中所有包含字符串"wf"的文件名稱的字符串?dāng)?shù)組。怎么樣,看起來是不是和C++中的functor差不多呢?
相關(guān)文章
Springboot整合企業(yè)微信機(jī)器人助手推送消息的實(shí)現(xiàn)
本文主要介紹了Springboot整合企業(yè)微信機(jī)器人助手推送消息的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作
這篇文章主要介紹了用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法
這篇文章主要介紹了MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別
這篇文章主要介紹了關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
springboot使用RedisRepository操作數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了springboot使用RedisRepository操作數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

