class Observer:
def __init__(self, subject):
self.subject: Subject = subject
@abstractmethod
def update(self):
raise NotImplemented
class Subject:
observers: List[Observer] = []
state: int
def getState(self):
return self.state
def setState(self, state: int):
self.state = state
self.notifyAllObservers()
def attach(self, observer: Observer):
self.observers.append(observer)
def notifyAllObservers(self):
for observer in self.observers:
observer.update()
class BinaryObserver(Observer):
def __init__(self, subject: Subject):
Observer.__init__(self, subject)
self.subject.attach(self)
def update(self):
print(f'BinaryObserver:{self.subject.getState()}')
class OctalObserver(Observer):
def __init__(self, subject: Subject):
Observer.__init__(self, subject)
self.subject.attach(self)
def update(self):
print(f'OctalObserver:{self.subject.getState()}')
class HexaObserver(Observer):
def __init__(self, subject: Subject):
Observer.__init__(self, subject)
self.subject.attach(self)
def update(self):
print(f'HexaObserver:{self.subject.getState()}')
class ObserverPatternDemo:
def __init__(self):
subject: Subject = Subject()
BinaryObserver(subject)
OctalObserver(subject)
HexaObserver(subject)
subject.setState(22)
if __name__ == '__main__':
ObserverPatternDemo()
BinaryObserver:22
OctalObserver:22
HexaObserver:22