Skip to content

Instantly share code, notes, and snippets.

@AhmetCanSolak
Created October 25, 2018 16:22
Show Gist options
  • Save AhmetCanSolak/6340d5d74e5152468b68f6ae895e3bc5 to your computer and use it in GitHub Desktop.
Save AhmetCanSolak/6340d5d74e5152468b68f6ae895e3bc5 to your computer and use it in GitHub Desktop.
Simple demonstration of observer pattern
"""
This is a simple demonstration of observer pattern
"""
__author__ = 'AhmetCanSolak'
class Subject(object):
observers = []
def __init__(self):
self.observers = []
def add_observer(self, observer):
if observer not in Subject.observers:
Subject.observers.append(observer)
def remove_observer(self, observer):
try:
Subject.observers.remove(observer)
except ValueError:
return None
def notify(self, source=None):
print("notify is called")
for observer in Subject.observers:
if observer != source:
print("update called")
observer.update() # change to call update method of viewer/container
class Image(Subject):
def __init__(self, name=''):
Subject.__init__(self)
self.name = name
self._data = [1]
@property
def data(self):
return self._data
@data.setter
def data(self, value):
self._data = value
self.notify(self)
def update(self):
print(self.name, self._data)
# Initialize
img1 = Image("im1")
img2 = Image("im2")
img3 = Image("im3")
img4 = Image("im4")
sub = Subject()
sub.add_observer(img1)
sub.add_observer(img2)
sub.add_observer(img3)
sub.add_observer(img4)
# Change value of one to verify demo is working
img2.data = [4]
# keep changing data of one and observers will notify on each change
while input() != 'c':
img2.data = [img2.data[0] + 1]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment