Revision 1 as of 2003-12-02 18:54:08

Clear message

Delegation Event Model is ...


pro


cons

   1 # Code is Public Domain.
   2 # Basic objects:
   3 
   4 class Event(object):
   5     """ Object that contain information on the event message """
   6     def __init__(self):
   7         self._source = None
   8         
   9     def getSource(self):
  10         return self._source
  11 
  12     def setSource(self,value):
  13         self._source = value
  14 
  15     source = property(getSource,setSource)
  16 
  17     def getEventType(self):
  18         return self.__class__.__name__
  19 
  20     eventType = property(getEventType)
  21 
  22 class Listener(object):
  23     """ Object that wait for Event Message """
  24     def processEvent(self,event):
  25         funcName = "process%sEvent" % event.eventType
  26         if hasattr(self,funcName):
  27             apply(getattr(self,funcName),[event])
  28 
  29 class Source(object):
  30     """ Object that produce Event Message """
  31     def __init__(self):
  32         self._listeners = {}
  33 
  34     def _initListenersList(self,eventType):
  35         if not eventType in self._listeners:
  36             self._listeners[eventType] = []
  37 
  38     def addEventListener(self,eventType,listener):
  39         self._initListenersList(eventType)
  40         self._listeners[eventType].append(listener)
  41 
  42     def publishEvent(self,event):
  43         self._initListenersList(event.eventType)
  44         event.source = self
  45         for listener in self._listeners[event.eventType]:
  46             listener.processEvent(event)
  47 
  48 # let's go for subclassing all of this stuff:
  49 
  50 class Command(Event):
  51     """ a command has an action attribute that indicate what has to be done"""
  52     def __init__(self,action):
  53         super(Command,self).__init__()
  54         self.action = action
  55 
  56 class CommandListener(Listener):
  57     """ listen for command event.
  58     It call the method do<<Action>> when a command event occur...
  59     """
  60     def processCommandEvent(self,event):
  61         funcName = "do%s" % event.action.capitalize()
  62         if hasattr(self,funcName):
  63             apply(getattr(self,funcName),[event])
  64 
  65 class CommandSource(Source):
  66     """ here the producer of command Event """
  67     addCommandListener = lambda self,listener: self.addEventListener('Command',listener)
  68 
  69     def push(self):
  70         # do stuf here
  71         e = Command('push')
  72         self.publishEvent(e)
  73 
  74     def move(self):
  75         # do stuff here
  76         e = Command('move')
  77         self.publishEvent(e)
  78 
  79     def sayHello(self):
  80         print "Hi! I'm the  Command source"
  81 
  82 # and now implement some listeners :
  83 
  84 class MyCommandListener(CommandListener):
  85     """ here one listener of command Event """
  86     def doPush(self,event):
  87         print 'MyCmdListener:\tpush\t',event.source
  88 
  89     def doMove(self,event):
  90         print 'MyCmdListener:\tmove\t',event.source
  91         # see how you can act on the source
  92         event.source.sayHello()
  93 
  94 class MyAllEventListener(Listener):
  95     """ here a special listener that wait for any event """
  96     def processEvent(self,event):
  97         print 'AllEvent:\t',event.eventType,'\t',event
  98 
  99 def test():
 100     s = CommandSource()
 101     # add both listener to the producer
 102     s.addCommandListener(MyCommandListener())
 103     s.addCommandListener(MyAllEventListener())
 104     # now do some stuf on the source
 105     print '-'*10,'push','-'*10
 106     s.push()
 107     print '-'*10,'move','-'*10
 108     s.move()
 109 
 110 
 111 test()

Unable to edit the page? See the FrontPage for instructions.