<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海闊天空

    I'm on my way!
    隨筆 - 17, 文章 - 69, 評(píng)論 - 21, 引用 - 0
    數(shù)據(jù)加載中……

    java中進(jìn)行callback方法調(diào)用

    回調(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)然用的是過程式的語言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());

      greater()就是我們傳遞的一個(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差不多呢?

     anonymous inner class    和  closure (7.0)都是體現(xiàn)回調(diào)的思想

    posted on 2009-08-21 21:43 石頭@ 閱讀(4025) 評(píng)論(0)  編輯  收藏 所屬分類: java_base

    主站蜘蛛池模板: 无码中文字幕av免费放| 亚洲欧洲在线播放| 国产在亚洲线视频观看| AA免费观看的1000部电影| 亚洲jjzzjjzz在线观看| 美女视频黄的免费视频网页| 亚洲真人无码永久在线| a级毛片免费网站| 久久久久无码专区亚洲av| 国产免费AV片在线观看播放| 中文字幕亚洲激情| 国内永久免费crm系统z在线| 亚洲AV无码乱码在线观看裸奔 | 国产一卡二卡四卡免费| 亚洲一区电影在线观看| 成人性生交视频免费观看| 亚洲熟妇无码一区二区三区导航| 四虎成人免费网址在线| 国产精品亚洲精品日韩动图| 亚洲综合久久夜AV | 午夜免费福利小电影| 亚洲一区中文字幕在线电影网| 在线观看成人免费| 乱爱性全过程免费视频| 久久精品国产亚洲av四虎| 成人免费午夜无码视频| 日韩毛片在线免费观看| 久久精品亚洲中文字幕无码网站| 波多野结衣中文字幕免费视频| 国产AV无码专区亚洲AV麻豆丫 | 亚洲av无码国产精品色在线看不卡| 一级做受视频免费是看美女| 自怕偷自怕亚洲精品| 免费看片免费播放| 三年片免费观看大全国语| 亚洲一级毛片视频| 不卡一卡二卡三亚洲| 免费福利网站在线观看| 国产精品成人免费观看| 亚洲白色白色永久观看| 亚洲国产黄在线观看|