zoukankan      html  css  js  c++  java
  • 设计模式之监听模式

    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()
  • 相关阅读:
    自定义控件小结进阶篇
    SQL注入语句 (很全)
    C# winform DataGridView 属性说明 [C# .NET]
    MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
    精妙SQL语句大全
    sql语句
    注销时关闭当前窗体,返回登入界面
    C#中DataGridView的使用 [C# .NET]
    C#开发 WinForm中窗体显示和窗体传值相关知识
    HDU2553 (N皇后)
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12953675.html
Copyright © 2011-2022 走看看