深入浅出设计模式python版——观察者模式(observer)

书中第二个设计模式——观察者模式

首先,祭出类图

《深入浅出设计模式python版——观察者模式(observer)》《深入浅出设计模式python版——观察者模式(observer)》

《深入浅出设计模式python版——观察者模式(observer)》《深入浅出设计模式python版——观察者模式(observer)》

书中举得例子:

一般方式

《深入浅出设计模式python版——观察者模式(observer)》

使用java内置模块的方式

《深入浅出设计模式python版——观察者模式(observer)》

《深入浅出设计模式python版——观察者模式(observer)》

《深入浅出设计模式python版——观察者模式(observer)》

python代码:

主题/可观察者:

# -*- coding:utf-8 -*-
#Subject.py
import Observer
class Subject:
    def __init__(self):
        self.__observers = []
        self.__changed = True

    def registerObserver(self,observer):
        self.__observers.append(observer)

    def removeObserver(self, observer):
        self.__observers.remove(observer)

    def notifyObservers(self):
        if self.__changed == True:
            for everyObserver in self.__observers:
                everyObserver.update(self)
            self.changed =False
    @property
    def changed(self):
        return self.__changed
    @changed.setter
    def changed(self, value):
        if isinstance(value, bool):
            self.__changed = value

class WeatherData(Subject):
    def __init__(self):
        Subject.__init__(self)
        self.__temperature = 0
        self.__humidity = 0

    @property
    def temperature(self):
        return self.__temperature
    @property
    def humidity(self):
        return self.__humidity

    @temperature.setter
    def temperature(self, value):
        if isinstance(value, int):
            self.__temperature = value

    @humidity.setter
    def humidity(self, value):
        if isinstance(self, int):
            self.__humidity = value

    def setMeasurements(self, temperature, humidity):
        self.temperature = temperature
        self.humidity = humidity
        self.changed = True
        self.notifyObservers()

def main():
    weatherData = WeatherData()
    currentDisplay = Observer.CurrentConditionsDisplay(weatherData)
    statisticsTempDisplay = Observer.StatisticsTempDisplay(weatherData)
    weatherData.setMeasurements(25, 50)
    weatherData.setMeasurements(26, 70)
    weatherData.setMeasurements(12, 32)


if __name__ == "__main__":
    main()

观察者:

# -*- coding:utf-8 -*-
#Observer.py
import  Subject
import Display
class Observer:
    def __init__(self, observable):
        self.__observable = observable
        observable.registerObserver(self)
        self.__temperature = None
        self.__humidity = None

    def update(self, subject):
        pass

class CurrentConditionsDisplay(Observer, Display.Display):
    def __init__(self, observable):
        Observer.__init__(self,observable)

    def update(self, subject):
        self.__humidity = subject.humidity
        self.__temperature = subject.temperature
        self.display()

    def display(self):
        print "temperature " + str(self.__temperature),
        print "humidity " + str(self.__humidity)

class StatisticsTempDisplay(Observer, Display.Display):
    def __init__(self, observable):
        Observer.__init__(self,observable)
        self.__max = 0
        self.__min = 200
        self.__num = 0
        self.__sum = 0

    def update(self, subject):
        if self.__max < subject.temperature:
            self.__max = subject.temperature
        if self.__min > subject.temperature:
            self.__min = subject.temperature
        self.__num = self.__num + 1
        self.__sum = self.__sum + subject.temperature
        self.display()

    def display(self):
        print "max " + str(self.__max),
        print "min " + str(self.__min),
        print "avg " + str(float(self.__sum)/self.__num)

打印类:

# -*- coding:utf-8 -*-
#Display.py
class Display:

    def display(self):
        pass

《深入浅出设计模式python版——观察者模式(observer)》

    原文作者:tuantuanlin
    原文地址: https://blog.csdn.net/tuantuanlin/article/details/51176042
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞