Python 设计模式—观察者模式

2022-07-04 20:43:19 浏览数 (2)

这是无量测试之道的第191篇原创
分享主题:Python 设计模式之观察者模式
定义

观察者模式也叫发布订阅模式,定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新。

观察者设计模式是最简单的行为模式之一。在观察者设计模式中,对象(主题)维护了一个依赖(观察者)列表,以便主题可以使用观察者定义的任何方法通知所有观察者它所发生的变化。

举个生活中的小例子:职员们趁老板不在,都在搞着自己与工作无关的事情,同时观察着前台小姐姐,前台小姐姐在老板回来的时候,发布通知让各同事回到工作状态。

使用场景

在广播或者发布订阅系统的情形中,你会看到观察者设计模式的用法,它的主要使用场景如下:

  • 在分布式系统中实现事件服务。
  • 用作新闻机器的框架。
  • 股票市场也是观察者模式的一个大型场景。
主要目标
  • 它定义了对象之间的一对多的依赖关系,从而使得一个对象中的任何更改都将自动通知给其他依赖的对象。
  • 它封装了主题的核心组件。
代码实现
1、创建观察者类
代码语言:javascript复制
class Watcher:
    #初始化具体的成员
    def __init__(self,id,name):
        self.id=id
        self.name=name

    #向具体的成员发送消息的方法
    def send(self,msg):
        print(str(self.name)  "-"   str(self.id) " recive the message is: " msg)
2、创建主题类
代码语言:javascript复制
class Subject:
    #初始化一个主题列表
    def __init__(self):
        self.queues=[]

    #将订阅者添加到队列中
    def add_queue(self,sub):
        self.queues.append(sub)
        return self.queues

    #从订阅的主题里面移除
    def remove_queue(self,sub):
        self.queues.remove(sub)
        self.queues

    #发送通知给相关的主题订阅者
    def notice(self,msg):
        for queue in self.queues:
            queue.send(msg)

if __name__ == '__main__':
    #实例化具体的Watcher对象,用于去订阅和接收相关信息
    tom=Watcher(1001,"tom")
    tony=Watcher(1002,"tony")
    jack=Watcher(1003,"jack")

    #实例化Subject对象,定义为添加天气主题
    weather=Subject()
    weather.add_queue(tom)
    weather.add_queue(tony)

    #实例化Subject对象,定义为添加军事主题
    military=Subject()
    military.add_queue(tony)
    military.add_queue(jack)

    #给订阅者发布天气消息
    weather.notice("it's rain")
    military.notice("it's peace")

    #将tony从weather and military主题中取消订阅
    weather.remove_queue(tony)
    military.remove_queue(tony)

    #取消订阅后给剩下的订阅者发布消息
    weather.notice("it's windy")
    military.notice("it's war")
3、执行结果输出
代码语言:javascript复制
tom-1001 recive the message is: it's rain
tony-1002 recive the message is: it's rain
tony-1002 recive the message is: it's peace
jack-1003 recive the message is: it's peace
tom-1001 recive the message is: it's windy
jack-1003 recive the message is: it's war

end

0 人点赞