2011-03-25 49 views
0

我正在爲Detours庫創建一個Python包裝器。該工具的一部分是調度程序,將所有掛鉤的API調用發送給各個處理程序。模式 - 事件調度程序沒有其他如果?

現在我的代碼如下所示:

if event == 'CreateWindowExW': 
    # do something 
elif event == 'CreateProcessW': 
    # do something 
elif ... 

這種感覺難看。是否有創建事件調度程序的模式,而不必爲每個Windows API函數創建elif分支?

回答

4

一個很好的方式做,這是定義具有等同於相關的API方法的類函數名稱,以及調度到正確方法的調度方法。例如:

class ApiDispatcher(object): 

    def handle_CreateWindowExW(self): 
     # do whatever 

    def handle_CreateProcessW(self): 
     # do this one 

    def dispatch(self, event): 
     method = getattr(self, 'handle_%s' % event) 
     method() 
2

那些如果最終必須去某個地方。爲什麼不去做這樣的:

handler = get_handler(event) 
handler.process() 

,並在get_handler你有你的IFS,每返回一個對象,它確實在process方法開展工作。

的替代將是一個地圖,可調用,就像這樣:

def react_to_create_window_exw(): 
    # do something with event here 
    pass 

handlers = { 
    "CreateWindowExW" : react_to_create_window_exw 
} 

,你會使用這樣的:

handler = handlers[event] 
handler() 

這樣你就不會使用任何的if/else條件。

2

您可以使用dispatch dict方法。

def handle_CreateWindowExW(): 
    print "CreateWindowExW"  
    #do something 

events = { 
    "CreateWindowExW": handle_CreateWindowExW 
} 

events[event]() 

這樣,您可以添加事件而不必添加不同的if語句。

1

通常在這種情況下,如果您有預定義的要採取的操作列表,請使用

def CreateWindowExW(): 
    print 'CreateWindowExW' 

def CreateProcessW(): 
    print 'CreateProcessW' 

action_map = { 
    'CreateWindowExW': CreateWindowExW, 
    'CreateProcessW': CreateProcessW 
} 

for action in ['CreateWindowExW', 'UnkownAction']: 
    try: 
     action_map[action]() 
    except KeyError: 
     print action, "Not Found" 

輸出:

CreateWindowExW 
UnkownAction Not Found 

因此使用地圖,你可以創建一個非常強大的調度