Python @ DjangoSpin

PyPro #92 Observer Design Pattern

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon
Reading Time: 1 minutes

Observer Design Pattern in Python

Observer Design Pattern in Python

Write a Python program to implement Observer Design Pattern.

class Core:
        '''Represents what is being observed.'''
        def __init__(self, name):
                '''Initialized an empty list of observers; Set the name of the core; initialize its temperature.'''
                self._observers = []
                self._name = name
                self._temp = 0
 
        def attach(self, observer):
                '''If the observer is not already in the observers list; append the observer to the list'''
                if observer not in self._observers:
                        self._observers.append(observer)
        def detach(self, observer):
                '''Remove the observer from the list of observers.'''
                try:
                        self._observers.remove(observer)
                except ValueError:
                        print("Observer is already not in the list of observers.")
        def notify(self):
                '''Alert all observers.'''
                for observer in self._observers:
                        observer.update(self)
                 
        # Getter that gets the temperature of core
        @property
        def temp(self):
                '''The @property decorator makes a property object 'temp', on which a setter can be defined, as done below.'''
                return self._temp
 
        #Setter that sets the temperature of core
        @temp.setter
        def temp(self, temp):
                '''Notify the observers whenever somebody changes the core temperature.
                   @temp.setter notation signifies the setter method of the temp property which
                   allows to set the temperature using the assignment operator i.e. objectOfCore.temp = 300
                   sets the temp attribute to 50'''
                self._temp = temp
                self.notify()
                 
class FacultyMonitoringCore:
        '''Observer: Monitoring the subject.'''
        def update(self, subject):
                '''Alert method invoked when the notify() method in the subject is invoked.'''
                if subject._temp > 350:
                    print("FacultyMonitoringCore says: {} has temperature {}. Code Red!!!".format(subject._name, subject._temp))
                else:
                    print("FacultyMonitoringCore says: {} has temperature {}. Everything is under control.".format(subject._name, subject._temp))
 
# Create a subject to be monitored
coreOne = Core("Core 1")
 
# Create observers
facultyMonitoringCoreOne = FacultyMonitoringCore()
facultyMonitoringCoreTwo = FacultyMonitoringCore()
 
# Attach the observers to the subject
coreOne.attach(facultyMonitoringCoreOne)
coreOne.attach(facultyMonitoringCoreTwo)
 
# Changing the temperature of the core, which invokes the notify() method of class Core, which in turn invokes the update() method of each observer.
coreOne.temp = 300
coreOne.temp = 360
 
## OUTPUT ##
FacultyMonitoringCore says: Core 1 has temperature 300. Everything is under control.
FacultyMonitoringCore says: Core 1 has temperature 300. Everything is under control.
FacultyMonitoringCore says: Core 1 has temperature 360. Code Red!!!
FacultyMonitoringCore says: Core 1 has temperature 360. Code Red!!!

See also:

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon

Leave a Reply