-
Notifications
You must be signed in to change notification settings - Fork 0
/
observer.py
74 lines (55 loc) · 1.65 KB
/
observer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from observer_pattern import Observer, Observable
class A(object):
_name="A"
def call_A(self):
print "You have called A!"
class B(object):
def call_B(self):
print "You have called B!"
class C(object):
def call_C(self):
print "You have called C!"
class MyObserver(Observer):
def update(self, obj, *args, **kwargs):
print "Hello! There is something new to observe!"
print "{0}:{1}:{2}".format(obj,args,kwargs)
class Adapter(Observable):
_initialised=False #private class variable
def __init__(self, obj, **adapted_methods):
super(Adapter,self).__init__()
self.obj=obj
for key, value in adapted_methods.items():
function = getattr(self.obj,value)
self.__setattr__(key,function)
self._initialised=True
def __getattr__(self,attr):
return getattr(self.obj,attr)
def __setattr__(self,key,value):
if not self._initialised:
super(Adapter,self).__setattr__(key,value)
else:
setattr(self.obj,key,value)
self.notify_observer(key=key, value=value)
class Facade:
adapters=None
@classmethod
def create_adapters(facade):
facade.adapters=[Adapter(A(),call='call_A'),Adapter(B(),call='call_B'),Adapter(C(),call='call_C')]
print "Created Adapters for A, B and C!"
@classmethod
def summon_adapters(facade):
for adapter in facade.adapters:
adapter.call()
@classmethod
def monitor(facade,observer):
facade.adapters[0].add_observer(observer)
print "Added Observer"
@classmethod
def change_name(facade, newName):
facade.adapters[0]._name=newName
if __name__ == '__main__':
myObserver = MyObserver()
Facade.create_adapters()
# Facade.summon_adapters()
Facade.monitor(myObserver)
Facade.change_name("New Name: AA")