观察者模式


# -*- coding: utf-8 -*-
### 观察者模式:
"""
    - 定义:
        订阅-发布者模式. 定义在对象间的一对多的依赖. 使得当前对象状态修改时,所有依赖它的对象都会得到通知,并自动更新
    - 场景:
        1. 消息交换.如:消息队列'
        2. 多级触发场景, 如:支持中断模式,一个中断引起连锁反应
    - 优点:
        1. 观察者 和 被观察者 之间是抽象的耦合
        2. 可以将许多符合单一职责原则的模块进行触发,可以实现广播
    - 缺点:
        1. 观察者模式带来的整体系统效率的浪费
        2. 如果被观察者之间有依赖, 梳理逻辑关系比较费心思
"""


class Osberver(object):
    """
        # 观察着 基类
    """

    def update(self):
        pass


class AlarmSensor(Osberver):
    """
        # 报警器 观察者
    """

    def update(self, action):
        print(f'Alarm Got: {action}')
        self.runAlarm()

    def runAlarm(self):
        print('Alarm Ring...')


class WaterSprinker(Osberver):
    """
        # 洒水器 观察者
    """

    def update(self, action):
        print(f'Sprinker Got: {action}')
        self.runSprinker()

    def runSprinker(self):
        print('Spray Water...')


class EmergencyDialer(Osberver):
    """
        # 拨号器 观察者
    """

    def update(self, action):
        print(f'Dial Got: {action}')
        self.runDialer()

    def runDialer(self):
        print('Dial 119...')


class Observed():
    observers = []
    action = ''

    def addObserver(self, observer):
        self.observers.append(observer)

    def notifyAll(self):
        """
            # 通知 各个观察者
        :return:
        """
        for obs in self.observers:
            obs.update(self.action)


class SmokerSensor(Observed):
    """
        # 抽烟 被观察者
    """

    def setAction(self, action):
        """
            # 设置 动作
        :param action:
        :return:
        """
        self.action = action

    def isFire(self):
        """
            # 触发火灾
        :return:
        """
        return True


if __name__ == '__main__':
    alarm = AlarmSensor()
    sprinker = WaterSprinker()
    dialer = EmergencyDialer()

    smoke_sensor = SmokerSensor()
    # 添加  观察者
    smoke_sensor.addObserver(alarm)
    smoke_sensor.addObserver(sprinker)
    smoke_sensor.addObserver(dialer)

    if smoke_sensor.isFire():  # 触发 火情
        # 设置 动作
        smoke_sensor.setAction('On Fire')
        # 通知 观察者
        smoke_sensor.notifyAll()

posted @   染指未来  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示