<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年6月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

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

    下面是我沿用Java annotation的思維 寫(xiě)的一個(gè)使用Decorator模式,進(jìn)行消息處理例子,代碼很不完善,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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 噜噜噜亚洲色成人网站∨| 久久久青草青青国产亚洲免观| 亚洲AV无码久久精品色欲| 中美日韩在线网免费毛片视频| 四虎影院免费视频| 一本色道久久88亚洲精品综合| 在线看免费观看AV深夜影院| 亚洲视频在线观看| 7723日本高清完整版免费| 亚洲一卡二卡三卡四卡无卡麻豆| 中文字幕乱码免费视频| 亚洲国产精品久久丫| 成视频年人黄网站免费视频| 亚洲乱码一二三四区麻豆| 成人毛片免费观看视频在线| 亚洲国产精品无码久久久秋霞1| 成年女人永久免费观看片| 一级女人18片毛片免费视频| 亚洲国产另类久久久精品黑人| 国产免费爽爽视频在线观看| 亚洲欭美日韩颜射在线二| 黄色网址在线免费| 亚洲一区中文字幕在线电影网 | 亚洲精品无码aⅴ中文字幕蜜桃| 国产精品麻豆免费版| 一级**爱片免费视频| 久久亚洲国产精品五月天| 日韩精品福利片午夜免费观着| 亚洲va中文字幕| 亚洲中文字幕久久精品无码喷水| 91香蕉国产线在线观看免费 | 亚洲精品成人av在线| 69天堂人成无码麻豆免费视频| 无码亚洲成a人在线观看| 亚洲综合色婷婷七月丁香| 四虎精品视频在线永久免费观看| 亚洲av无码一区二区三区在线播放| 亚洲а∨天堂久久精品| 日本高清免费观看| 精品久久亚洲一级α| 777亚洲精品乱码久久久久久 |