<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, 評論 - 21, 引用 - 0
    數(shù)據(jù)加載中……

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

    回調(diào)函數(shù)(callback function)這個(gè)概念, 所謂回調(diào)函數(shù),就是指這個(gè)函數(shù)先在某處注冊,而它將在稍后某個(gè)需要的時(shí)候被調(diào)用。比如在利用SDK 進(jìn)行Windows編程的時(shí)候,我們需要注冊一個(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)上。  比如對一個(gè)存放int數(shù)據(jù)的vector進(jìn)行遞減排序的話,我們可以這樣進(jìn)行。

        sort(vec.begin(),vec.end(),greater());

      greater()就是我們傳遞的一個(gè)匿名對象,它重載了函數(shù)調(diào)用運(yùn)算符“()”。我們沒有顯式地調(diào)用這個(gè)對象里面提供的函數(shù),sort函數(shù)對對象里面的函數(shù)進(jìn)行call back。

      Java中要實(shí)現(xiàn)類似functor的功能,應(yīng)該怎么辦呢?Command模式可以幫上忙。Command模式看起來很簡單,只要把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è)要求是什么呢?你要對這個(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) 評論(0)  編輯  收藏 所屬分類: java_base

    主站蜘蛛池模板: 曰批全过程免费视频在线观看无码 | 亚洲男人都懂得羞羞网站| 亚洲AV无码AV吞精久久| 青娱乐在线免费观看视频| 国产极品美女高潮抽搐免费网站 | 一本久到久久亚洲综合| 亚洲av日韩av永久在线观看| 国产青草视频在线观看免费影院| 亚洲精品制服丝袜四区| 野花香在线视频免费观看大全| 国国内清清草原免费视频99 | 亚洲熟妇av一区二区三区下载| 精品在线免费视频| 亚洲成a人片在线观看国产| 女人裸身j部免费视频无遮挡| 午夜性色一区二区三区免费不卡视频| 亚洲精品麻豆av| 亚洲国产成人精品激情| 午夜免费福利影院| 情人伊人久久综合亚洲| 亚洲国产AV无码专区亚洲AV| 三年片在线观看免费大全电影| 亚洲黄片毛片在线观看| 中国在线观看免费的www| 日韩一级视频免费观看| 亚洲精品无码久久久久久久| 人成午夜免费视频在线观看| 激情无码亚洲一区二区三区| 亚洲男人av香蕉爽爽爽爽| 免费国产在线视频| 亚洲中文字幕日产乱码高清app | 香蕉视频在线观看亚洲| 最近2019中文字幕免费大全5| 亚洲精品成人无码中文毛片不卡| 深夜a级毛片免费无码| 亚洲αv在线精品糸列| 在线观看AV片永久免费| 一区视频免费观看| 亚洲同性男gay网站在线观看| 暖暖免费在线中文日本| 亚洲熟女综合色一区二区三区 |