大規模回調函數(函數指針)的一種實現方法

/**
 * 這是今天看到的一種寫法,以前沒有注意,今天其他
 * 需求又看了一下,有點感觸,精簡一下分享出來。
 * 
 * register和call裏面的while循環是此方法的精髓。
 * 同一個id可以有很多個不同的註冊函數,
 * 這些函數通過register中的while循環添加到鏈表中,
 * 又通過call中的while循環一個一個的調用。
 * 
 * 在複雜重複邏輯的地方用起來會很方便,會顯得很巧妙。
 * 我感覺這種方法在某種語言中應該是很常見的,但是我
 * 只對C有簡單的瞭解,就不知道出處了。讀者如果知道
 * 希望能夠留言指點一下。謝謝。
 */

/**
 * 函數指針(回調函數)原型
 */
typedef int (*f)(void* param);

/**
 * 操作最小結構體
 */
typedef struct _mapping{
    int id;
    f   fun;
    struct mapping* next;
}mapping;

/**
 * 最多支持128個不同的id的回調函數
 */
mapping* registry[128];

/**
 * 註冊方法
 */
void register(int _id, f function){
    
    mapping* item = malloc(sizeof(mapping));
    item->id = _id;
    item->fun = function;
    item->next = NULL;
    
    for(int i=0; i<(registry/sizeof(registry[0])), i++){
        if(!registry)
            registry[i] = item;
        else if(registry[i]->id == _id){
            mapping* map = registry[i];
            while(map->next){
                map = registry[i]->next;
            }
            map->next = item;
        }
    }
    
}

/**
 * 調用方法
 */
void call(void* param){
    
    mapping* map;
    for(int i=0; i<(sizeof(registry)/registry[0]); i++){
        if(!registry[i])
            break;
        if(registry[i]->id != param->id)
            continue;
        
        map = registry[i];
        while (map){
            map->fun(param);
            map = map->next;
        }
    }
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章