• 设计模式监听模式


    一:监听模式

    什么是监听模式?
    监听模式是一种一对多的关系,可以有任意个观察者同时监听某一个对象。监听的对象叫观察者,被监听的对象叫被观察者。被观察者对象的内容或数据发生变化时,会通知所有监听者作出相应的变化。

    监听者模式设计思想
    在观察者和被观察者之间建立一种自动触发的关系。

    监听模式的模型抽象

    基于框架的实现

    from abc import ABCMeta, abstractmethod
    
    
    class Observer(metaclass=ABCMeta):
        """观察者基类"""
    
        @abstractmethod
        def update(self, observable):
            pass
    
    
    class Observable:
        """被观察者基类"""
    
        def __init__(self):
            print(2222)
            self.observers = []
    
        def addObserber(self, observer):
            self.observers.append(observer)
    
        def removeObserver(self, observer):
            self.observers.remove(observer)
    
        def notifies(self):
            for o in self.observers:
                o.update(self)
    
    
    class WaterHeater(Observable):
        def __init__(self):
            super().__init__()  # 调用父类的init
            self.__temperature = 25
    
        def getTemperature(self):
            return self.__temperature
    
        def setTemperature(self, temperature):
            self.__temperature = temperature
            print('当前温度是: ', temperature)
            self.notifies()
    
    
    class WashingMode(Observer):
        def update(self, observable):
            if isinstance(observable,
                          WaterHeater) and observable.getTemperature() >= 50 and observable.getTemperature() <= 70:
                print('水已烧好,可以用来洗澡')
    
    
    class DrinkMode(Observer):
        def update(self, observable):
            if isinstance(observable, WaterHeater) and observable.getTemperature() > 70:
                print('水可以喝了')
    
    
    def test():
        heater = WaterHeater()
        washingobserver = WashingMode()
        drinkobserver = DrinkMode()
        heater.addObserber(washingobserver)
        heater.addObserber(drinkobserver)
        heater.setTemperature(60)
        heater.setTemperature(80)
    
    
    test()
    
    

    设计要点

    1. 明确谁是观察者,谁是被观察者
    2. Observerable在发送广播的时候,无需指定具体的Observer,Observer可以自行决定是否订阅通知
    3. 被观察者至少需要有三个方法,添加监听者,移除监听者,通知Observer方法。观察者知道有一个方法,更新方法,即更新当前内容
    4. 添加和移除监听者在不同的模型中称谓可能不同。在观察者模型中一般是addObserver/removeObserver;在源/监听器中一般是(Source/Listener);在桌面编程的窗口中可能是(attachWindow/detachWindow)

    应用场景

    1. 对一个对象的状态或内容进行更新,需要其它对象同步更新,或者一个对象的更新需要以来其它对象的更新。
    2. 对象仅需要将自己的更新通知到其它对象,不需要知道其它对象的细节。
  • 相关阅读:
    adapter 异步加载
    退出应用
    scrollview 和 edittext 焦点冲突
    判断字符串
    generate portable version cannot addon plugin(buffer var)
    在ubuntu上面安装perl
    TV
    关于xilinx ise10.1与modelsim仿真库编译
    迅雷tips
    Verilog log2 函数
  • 原文地址:https://www.cnblogs.com/tingshu/p/15584056.html
Copyright © 2020-2023  润新知