Action模式实现
--- by huangyi [email protected]
今天看到 这篇好文, 里面有一部分讲到Action模式在游戏里面的应用, 感觉有点意思就随手写了写, 总算赶在熄灯之前搞定, 呵呵。 希望这半桶水的英文注释不会让你感觉太头疼
1 class Action(object):
2 reg_after = {}
3 reg_before = {}
4 def __init__(self,func):
5 self.internal = func
6 def __call__(self):
7 '''excute all actions registered to excute before self,
8 then excute self,
9 last excute all actions registered to excute after self.'''
10 if self.reg_before.has_key(self):
11 acs = self.reg_before[self]
12 for a in acs:
13 a()
14 self.internal()
15 if self.reg_after.has_key(self):
16 acs = self.reg_after[self]
17 for a in acs:
18 a()
19 def before(self,action):
20 'register self take place before action'
21 self.register(action,self,self.reg_before)
22 def after(self,action):
23 'register self take place after action'
24 self.register(action,self,self.reg_after)
25 @staticmethod
26 def register(ac1,ac2,reg):
27 if reg.has_key(ac1):
28 reg[ac1].append(ac2)
29 else:reg[ac1]=[ac2]
30
31 class Door(object):
32 def __init__(self,no):
33 self.no = no
34 self.Open = Action(self.ac_Open)
35 def ac_Open(self):
36 print 'door',self.no,'open'
37
38 class Player(object):
39 def __init__(self,name):
40 self.name = name
41 self.Die = Action(self.ac_Die)
42 def ac_Die(self):
43 print self.name,'player die'
44
45 class Beer(object):
46 def __init__(self,no):
47 self.no = no
48 self.Start = Action(self.ac_Start)
49 def ac_Start(self):
50 print 'beer',self.no,'start'
51
52 if __name__ =='__main__':
53 player = Player('hy')
54 door = Door(1)
55 beer = Beer(1)
56 door.Open.before(player.Die)
57 beer.Start.after(door.Open)
58 player.Die()
...