1+ #!/usr/bin/env python
2+ # encoding: utf-8
3+
4+ """
5+ @author: zhanghe
6+ @software: PyCharm
7+ @file: observer.py
8+ @time: 2017/6/12 下午6:06
9+ """
10+
11+
12+ class AbstractSubject (object ):
13+ def register (self , listener ):
14+ raise NotImplementedError ("Must subclass me" )
15+
16+ def de_register (self , listener ):
17+ raise NotImplementedError ("Must subclass me" )
18+
19+ def notify_listeners (self , event ):
20+ raise NotImplementedError ("Must subclass me" )
21+
22+
23+ class Listener (object ):
24+ def __init__ (self , name , subject ):
25+ self .name = name
26+ subject .register (self )
27+
28+ def notify (self , event ):
29+ print self .name , "received event" , event
30+
31+
32+ class Subject (AbstractSubject ):
33+ def __init__ (self ):
34+ self .listeners = []
35+ self .data = None
36+
37+ def get_user_action (self ):
38+ self .data = raw_input ('Enter something to do:' )
39+ return self .data
40+
41+ # Implement abstract Class AbstractSubject
42+
43+ def register (self , listener ):
44+ self .listeners .append (listener )
45+
46+ def de_register (self , listener ):
47+ self .listeners .remove (listener )
48+
49+ def notify_listeners (self , event ):
50+ for listener in self .listeners :
51+ listener .notify (event )
52+
53+
54+ if __name__ == "__main__" :
55+ # make a subject object to spy on
56+ subject_obj = Subject ()
57+
58+ # register two listeners to monitor it.
59+ listenerA = Listener ("<listener A>" , subject_obj )
60+ listenerB = Listener ("<listener B>" , subject_obj )
61+
62+ # simulated event
63+ subject_obj .notify_listeners ("<event 1>" )
64+ # outputs:
65+ # <listener A> received event <event 1>
66+ # <listener B> received event <event 1>
67+
68+ action = subject_obj .get_user_action ()
69+ subject_obj .notify_listeners (action )
70+ # Enter something to do:hello
71+ # outputs:
72+ # <listener A> received event hello
73+ # <listener B> received event hello
74+
75+
76+ # https://zh.wikipedia.org/wiki/观察者模式
0 commit comments