设计模式--监听模式

一:监听模式

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

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

监听模式的模型抽象

基于框架的实现

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. 对象仅需要将自己的更新通知到其它对象,不需要知道其它对象的细节。
posted @ 2021-11-21 12:20  tingshu  阅读(750)  评论(0编辑  收藏  举报