• 设计模式之监听模式


    from abc import ABCMeta, abstractmethod
    import time
    
    '''
    别名:监听模式、观察者模式、推拉模型、订阅模式(一对多)
    被观察者的三个方法:添加观察者、移出观察者、通知观察者
    观察者的一个方法:更新方法
    每当被观察者的状态发生改变时,就会通知观察者,观察者就会判断被观察者的状态是否达到自己需要响应的标准,从而响应或者不响应
    '''
    
    
    class Observer(metaclass=ABCMeta):
        '''观察者的基类'''
        @abstractmethod
        def update(self, observable, object):
            pass
    
    
    class Observable:
        '''被观察者的基类'''
        def __init__(self):
            self.__observers = []
    
        def removeObserver(self, observer):
            self.__observers.remove(observer)
    
        def addObserver(self, observer):
            self.__observers.append(observer)
    
        def notifyObservers(self):
            for observer in self.__observers:
                observer.update(self)
    
    
    class WaterHeater(Observable):
        '''热水器'''
        def __init__(self):
            super().__init__()
            self.__temperature = 25
        
        def setTemperature(self, temperature):
            if temperature > 100:
                temperature = 100
            # 每当状态发生改变时,就要通知被观察者,至于被观察者响不响应就是另一回事了
            self.__temperature = temperature
            self.notifyObservers()
    
        def getTemperature(self):
            print("现在水温是", self.__temperature, "")
            return self.__temperature
    
    
    class WashMode(Observer):
        '''洗澡模式'''
        def update(self, observable):
            if observable.getTemperature() > 50 and observable.getTemperature() < 70:
                print("水已经烧好!温度正好,可以用来洗澡了。")
    
    
    class DrinkMode(Observer):
        '''饮用模式'''
        def update(self, observable):
            if observable.getTemperature() == 100:
                print("水已经烧好!可以放心饮用了。")
    
    
    
    if __name__ == "__main__":
        heater = WaterHeater()
        washObser = WashMode()
        drinkObser = DrinkMode()
        heater.addObserver(washObser)
        heater.addObserver(drinkObser)
        for i in range(1000):
            time.sleep(0.1)
            heater.setTemperature(i)
            heater.getTemperature()
  • 相关阅读:
    flask与Django的区别
    flask特殊装饰器
    flaskjinjia2模板
    flask类视图
    flask路由系统
    flask初识
    python2与python3 的安装与环境变量的添加
    WebGL_0007:强制横屏的参考
    NodeJS_0011:nodejs重定向到一个链接或本地的页面的方法
    NodeJS_0006:nodejs响应超时处理
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12953675.html
Copyright © 2020-2023  润新知