分享主题:Python设计模式之观察者模式 定义 观察者模式也叫发布订阅模式,定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新。 观察者设计模式是最简单的行为模式之一。在观察者设计模式中,对象(主题)维护了一个依赖(观察者)列表,以便主题可以使用观察者定义的任何方法通知所有观察者它所发生的变化。 举个生活中的小例子:职员们趁老板不在,都在搞着自己与工作无关的事情,同时观察着前台小姐姐,前台小姐姐在老板回来的时候,发布通知让各同事回到工作状态。 使用场景 在广播或者发布订阅系统的情形中,你会看到观察者设计模式的用法,它的主要使用场景如下:在分布式系统中实现事件服务。用作新闻机器的框架。股票市场也是观察者模式的一个大型场景。 主要目标它定义了对象之间的一对多的依赖关系,从而使得一个对象中的任何更改都将自动通知给其他依赖的对象。它封装了主题的核心组件。 代码实现1、创建观察者类1classWatcher:2初始化具体的成员3definit(self,id,name):4self。idid5self。namename67向具体的成员发送消息的方法8defsend(self,msg):9print(str(self。name)str(self。id)recivethemessageis:msg)2、创建主题类1classSubject:2初始化一个主题列表3definit(self):4self。queues〔〕56将订阅者添加到队列中7defaddqueue(self,sub):8self。queues。append(sub)9returnself。queues1011从订阅的主题里面移除12defremovequeue(self,sub):13self。queues。remove(sub)14self。queues1516发送通知给相关的主题订阅者17defnotice(self,msg):18forqueueinself。queues:19queue。send(msg)2021ifnamemain:22实例化具体的Watcher对象,用于去订阅和接收相关信息23tomWatcher(1001,tom)24tonyWatcher(1002,tony)25jackWatcher(1003,jack)2627实例化Subject对象,定义为添加天气主题28weatherSubject()29weather。addqueue(tom)30weather。addqueue(tony)3132实例化Subject对象,定义为添加军事主题33militarySubject()34military。addqueue(tony)35military。addqueue(jack)3637给订阅者发布天气消息38weather。notice(itsrain)39military。notice(itspeace)4041将tony从weatherandmilitary主题中取消订阅42weather。removequeue(tony)43military。removequeue(tony)4445取消订阅后给剩下的订阅者发布消息46weather。notice(itswindy)47military。notice(itswar)3、执行结果输出1tom1001recivethemessageis:itsrain2tony1002recivethemessageis:itsrain3tony1002recivethemessageis:itspeace4jack1003recivethemessageis:itspeace5tom1001recivethemessageis:itswindy6jack1003recivethemessageis:itswar