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

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

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

    隨筆 - 67  文章 - 79  trackbacks - 0
    <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Java 5.0加入了annotation的特性,算是對Decorator模式有了優(yōu)雅的支持。現(xiàn)在的JUNIT和Hibernate都有了使用annotation的版本,減輕了代碼的編寫痛苦。但是在Java的GUI領(lǐng)域里面,還沒有使用annotation進行消息處理的例子。我想既然Hibernate可以,那么swing應(yīng)該也可以,可能是被效率和向下兼容的問題束縛住了。

    Python從2.4開始提供了Decorator的支持,其形式和Java大體相當,但本質(zhì)大相徑庭。
    具體的Decorator說明limodou大俠已經(jīng)說得很清楚了 http://www.donews.net/limodou/archive/2004/12/19/207521.aspx

    下面是我沿用Java annotation的思維 寫的一個使用Decorator模式,進行消息處理例子,代碼很不完善,but it works!!!!
    msg.py
      1 import string, threading
      2 from time import sleep, time
      3 
      4 
      5 def dumpObject(object):
      6     print '-'*12
      7     print 'Dump',object
      8     print '\n'.join([s+' = '+str(getattr(object, s)) for s in dir(object)])
      9     
     10 class MessageSample():
     11     def __init__(self,fromObject=None,title='',*args):
     12         self.fromObject=fromObject
     13         self.title=title
     14         self.args=args
     15         
     16 class messageManager():
     17     
     18     object=None
     19     @staticmethod
     20     def instance():
     21         if messageManager.object==None:
     22             mutex = threading.Lock()
     23             mutex.acquire()
     24             if messageManager.object==None:
     25                 messageManager.object=messageManager()
     26             mutex.release()
     27         return messageManager.object
     28     
     29     def __init__(self):
     30         self.queue=[]
     31         self.msgMap={}
     32         self.mutex = threading.Lock()
     33         self.RunMutex = threading.Lock()
     34         self.msgThread=None
     35         self.isRun=True
     36         
     37     def push(self,msg):
     38         #self.mutex.acquire()
     39         self.queue.append(msg)
     40         #self.mutex.release()
     41         
     42     def pop(self):
     43         #self.mutex.acquire()
     44         object = self.queue.pop(0)
     45         #self.mutex.release()
     46         return object
     47     
     48     def registerMsgHandler(self,fromObject,title,handler):
     49         self.mutex.acquire()
     50         if  self.msgMap.has_key((fromObject,title)):
     51             self.msgMap[(fromObject,title)].append(handler)
     52         else:
     53             self.msgMap[(fromObject,title)]=[handler,]
     54         self.mutex.release()
     55         
     56     def removeMsgHandler(self,handler):
     57         for k,v in self.msgMap.items():
     58             if handler in v:
     59                 self.mutex.acquire()
     60                 if handler in v:
     61                     v.remove(handler)
     62                 self.mutex.release()
     63                 
     64     def processMsg(self,msg):
     65         self.mutex.acquire()
     66         if (msg.fromObject,msg.title) in self.msgMap:
     67             handlers=[handler for handler in self.msgMap[(msg.fromObject,msg.title)] if callable(handler)]
     68             #print handlers,msg.args
     69             for handler in handlers :
     70                 handler(*msg.args)
     71         self.mutex.release()
     72         
     73     def dumpHandlers(self):
     74         for k,v in self.msgMap.items():
     75             print k,v
     76             
     77     def run(self):
     78         
     79         self.RunMutex.acquire()
     80         self.isRun=True
     81         self.RunMutex.release()
     82         def threadFunction():
     83             
     84             while self.isRun:
     85                 try:
     86                     msg=self.pop()
     87                     if msg!=None:
     88                         self.processMsg(msg)
     89                 except:
     90                     sleep(0.5)
     91                     
     92         self.msgThread=threading.Thread(target=threadFunction)
     93         self.msgThread.start()
     94         
     95     def stop(self):
     96         if self.msgThread != None:
     97             self.RunMutex.acquire()
     98             self.isRun=False
     99             self.RunMutex.release()
    100 def eventHandler(title='',fromObject=None):
    101     def wrap(fn):
    102         messageManager.instance().registerMsgHandler(fromObject,title,fn)
    103         return fn
    104     return wrap
    105 
    106 def sendMessage(fromObject,title,*args):
    107     msg=MessageSample(fromObject,title,*args)
    108     messageManager.instance().push(msg)

     1 from msg import  *
     2 from time import sleep
     3 import threading
     4 
     5 @eventHandler('New')
     6 def OnNewMsg1(str):
     7     print 'Get new message1',str   
     8     
     9 @eventHandler('New')
    10 def OnNewMsg2(str):
    11     print 'Get new message2',str      
    12 
    13 @eventHandler('exit')    
    14 def OnExit():
    15     
    16     messageManager.instance().stop()
    17     print 'hello'
    18     import sys
    19     sys.exit(0)
    20     
    21 class comp():
    22     def __init__(self):pass
    23 class sample():
    24     def __init__(self,str):
    25         self.str=str
    26         @eventHandler(fromObject=self.str,title='SizeChange')
    27         def OnSize(x,y):
    28             print 'size',x,y,str 
    29 
    30 if __name__=='__main__':
    31     #messageManager.instance().dumpHandlers()
    32     messageManager.instance().run()
    33     
    34     sendMessage(None,'New','hello')
    35     s='I am s'
    36     s2='I am s2'
    37     S=sample(s)
    38     SS=sample(s2)
    39     sendMessage(s,'SizeChange',800,600)
    40     sendMessage(s2,'SizeChange',800,600)
    41     sleep(5)
    42     messageManager.instance().removeMsgHandler(OnNewMsg2)
    43     
    44     sendMessage(None,'New','hello')
    45     
    46     messageManager.instance().push(MessageSample(title='exit'))#another way
    47 



    Output:
    Get new message1 hello
    Get new message2 hello
    size 
    800 600 I am s
    size 
    800 600 I am s2
    Get new message1 hello
    hello

    從代碼可以看出 不用寫什么消息映射表,也不用在代碼中顯示的進行監(jiān)聽器的注冊,只要在我們寫的消息處理函數(shù)上添加元數(shù)據(jù)就行了
    posted on 2008-06-20 15:32 zarra 閱讀(262) 評論(1)  編輯  收藏

    FeedBack:
    # re: Python Decorator[未登錄] 2008-07-02 13:38 apple
    您的代碼我總是看的云里霧里的~~~  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品国产99国产精品亚洲| 精品无码专区亚洲| 好爽又高潮了毛片免费下载| 天天综合亚洲色在线精品| 久久久久亚洲精品中文字幕| 亚洲免费网站在线观看| 黄色一级视频免费| 亚洲综合一区二区国产精品| 日韩免费高清一级毛片在线| 久青草视频97国内免费影视| 亚洲欧洲日韩极速播放| 在线观看亚洲天天一三视| 国产成人精品免费午夜app| 日本黄页网址在线看免费不卡| 亚洲欧洲在线观看| www.亚洲一区| 97无码免费人妻超级碰碰碰碰| 中文日本免费高清| 亚洲风情亚Aⅴ在线发布| 香蕉视频在线观看亚洲| 亚洲AV无码成人精品区大在线| 麻豆国产精品免费视频| 最新久久免费视频| 黄网站色视频免费观看45分钟 | 亚洲免费中文字幕| 亚洲综合国产精品第一页| 拨牐拨牐x8免费| 日韩精品人妻系列无码专区免费 | 亚洲人成色77777| 国产免费av片在线播放| 国产91色综合久久免费分享| 免费无码H肉动漫在线观看麻豆| 久久精品国产亚洲AV未满十八| 久久久亚洲欧洲日产国码aⅴ| 国产精品亚洲综合一区| 国产成人高清精品免费软件| 成人免费观看一区二区| 污视频在线观看免费| 最近更新免费中文字幕大全 | 午夜色a大片在线观看免费| 99在线观看视频免费|