麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Java > 正文

Java中的functor實(shí)現(xiàn)

2020-01-31 16:52:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
文章來(lái)源:csdn 作者:wangfengsdu

  經(jīng)常聽(tī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類(lèi),這個(gè)類(lèi)中有這樣一個(gè)參數(shù) lpfnWndProc, 要進(jìn)行消息處理,我們就要用處理消息的函數(shù)的指針給它賦值。消息處理函數(shù)什么時(shí)候被調(diào)用的?我們沒(méi)有顯式地在程序中看到啊。是OS調(diào)用的。  這是SDK的試驗(yàn)方式,當(dāng)然用的是過(guò)程式的語(yǔ)言C,可以通過(guò)傳遞函數(shù)的指針實(shí)現(xiàn)。

   C++中怎么來(lái)實(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)算符“()”。我們沒(méi)有顯式地調(diào)用這個(gè)對(duì)象里面提供的函數(shù),sort函數(shù)對(duì)對(duì)象里面的函數(shù)進(jìn)行call back。

  Java中要實(shí)現(xiàn)類(lèi)似functor的功能,應(yīng)該怎么辦呢?Command模式可以幫上忙。Command模式看起來(lái)很簡(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的類(lèi)就是ConcreteCommand。這個(gè)接口所聲明的操作 "accept" 就是看看目錄dir中的文件name是否滿足某種要求,如果滿足就返回true,否則就返回false。這個(gè)要求是什么呢?你要對(duì)這個(gè)接口進(jìn)行實(shí)現(xiàn)。比如我想看看這個(gè)文件的名稱(chēng)包含不包含指定的字符串,那么就可以定義下面的類(lèi):
   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類(lèi)中有這樣一個(gè)方法
      public String[] list(FilenameFilter filter)

  因此,我們就可以這樣做了:
      File file = new File(".");
      String[] list = file.list(new DirFilter("wf"));

  得到的list就是一個(gè)當(dāng)然目錄中所有包含字符串"wf"的文件名稱(chēng)的字符串?dāng)?shù)組。怎么樣,看起來(lái)是不是和C++中的functor差不多呢?

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人一级视频在线观看 | 二区三区四区视频 | 91情侣在线偷精品国产 | 国产精品一区二区三区在线播放 | 日本中文字幕久久 | av免费不卡国产观看 | 在线成人免费视频 | 久久国产精品99国产 | 亚洲情在线 | 免费特黄 | 成人做爰www免费看 欧美精品免费一区二区三区 | 男男啪羞羞视频网站 | 欧美亚洲国产成人 | 黄色小视频在线免费看 | 日本精品婷婷久久爽一下 | 久久网一区二区 | 亚洲第一精品在线 | 日本a∨精品中文字幕在线 欧美1—12sexvideos | 丁香天堂网 | 日韩欧美动作影片 | 日本中文字幕久久 | 色婷婷tv| 久久成人激情视频 | 精品亚洲二区 | 久久综合婷婷 | 欧美精品一区二区久久久 | 久久久久久久一区 | 福利免费在线观看 | 国产毛片毛片 | 久久久久久久久久久高潮一区二区 | 精品亚洲一区二区三区 | 欧美成人精品h版在线观看 国产一级淫片在线观看 | 在线观看中文字幕国产 | 亚洲一区二区三区视频免费 | 国产一区二区三区在线免费观看 | 在线免费日韩 | 18pao国产成人免费视频 | 巨乳激情| 在线亚洲免费 | 久久久www免费看片 亚洲综合视频一区 | 深夜免费视频 |