隨筆 - 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的版本,減輕了代碼的編寫痛苦。但是在Java的GUI領(lǐng)域里面,還沒有使用annotation進(jìn)行消息處理的例子。我想既然Hibernate可以,那么swing應(yīng)該也可以,可能是被效率和向下兼容的問題束縛住了。

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

          下面是我沿用Java annotation的思維 寫的一個(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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 遂溪县| 积石山| 曲周县| 宜良县| 南丹县| 靖江市| 札达县| 赣榆县| 淅川县| 嘉定区| 竹溪县| 凯里市| 浑源县| 吴桥县| 通许县| 阳西县| 宁夏| 马尔康县| 定州市| 玛纳斯县| 绍兴市| 平阳县| 新绛县| 舒兰市| 海城市| 行唐县| 弥渡县| 鄢陵县| 宿迁市| 台南县| 绵竹市| 南汇区| 金堂县| 梅河口市| 达日县| 栖霞市| 南木林县| 东辽县| 老河口市| 大关县| 中超|