做网站运维,马鞍山市网站建设公司,建设网站方法,xp网站建设观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系#xff0c;让多个观察对象同时监听一个主题对象#xff0c;当主题对象状态发生变化时会通知所有观察者,是它们能够自动更新自己#xff0c;是一种行为设计模式。观察者模式的结构1,Publisher 会…观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系让多个观察对象同时监听一个主题对象当主题对象状态发生变化时会通知所有观察者,是它们能够自动更新自己是一种行为设计模式。观察者模式的结构1,Publisher 会向其他对象发送值得关注的事件notifySubscribers。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入subscribe和当前订阅者离开列表unsubscribe的订阅构架。2,当新事件发生时发送者会遍历订阅列表并调用每个订阅者对象的通知方法。该方法是在订阅者接口中声明的。3,Subscriber 接口声明了通知接口。在绝大多数情况下该接口仅包含一个update方法。该方法可以拥有多个参数使发布者能在更新时传递事件的详细信息。4,Concrete Subscriber 具体订阅者,可以执行一些操作来回应发布者的通知。所有具体订阅者类都实现了同样的接口发布者不与具体类相耦合。5,订阅者通常需要一些上下文信息来正确地处理更新。因此发布者通常会将一些上下文数据作为通知方法的参数进行传递。发布者也可将自身作为参数进行传递使订阅者直接获取所需的数据。6,Client 会分别创建发布者和订阅者对象然后为订阅者注册发布者更新。观察者代码1 from __future__ importannotations2 from abc importABC, abstractmethod3 from random importrandrange4 from typing importList567 classSubject(ABC):8 9 声明一组用于管理订阅者的方法10 1112 abstractmethod13 def attach(self, observer: Observer) -None:14 15 添加观察者到subject.16 17 pass1819 abstractmethod20 def detach(self, observer: Observer) -None:21 22 从subject删除观察者.23 24 pass2526 abstractmethod27 def notify(self) -None:28 29 通知观察者事件的发生.30 31 pass323334 classConcreteSubject(Subject):35 36 Subject有一些状态状态变更需要通知观察者37 38 #Subject的状态所有的订阅者都要有39 _state: int None4041 #订阅用户列表42 _observers: List[Observer] []4344 def attach(self, observer: Observer) -None:45 print(Subject: Attached an observer.)46 self._observers.append(observer)4748 def detach(self, observer: Observer) -None:49 self._observers.remove(observer)5051 #通知所有订阅者52 def notify(self) -None:53 54 通知接口触发了所有的订阅用户的update方法55 5657 print(Subject: Notifying observers...)58 for observer inself._observers:59 observer.update(self)6061 def some_business_logic(self) -None:62 63 一些业务逻辑块处理业务逻辑后也可能会触发状态的变更需要调用notify通知所有订阅者64 6566 print(\nSubject: state change)67 self._state randrange(0, 10)6869 print(fSubject: My state has changed to: {self._state})70 self.notify()717273 classObserver(ABC):74 75 订阅者声明对象使用的update.76 7778 abstractmethod79 def update(self, subject: Subject) -None:80 81 接收到状态变更.82 83 pass848586 87 具体订阅者对状态的变更做出具体反应88 899091 classConcreteObserverA(Observer):92 def update(self, subject: Subject) -None:93 if subject._state 3:94 print(ConcreteObserverA: Reacted to the event)959697 classConcreteObserverB(Observer):98 def update(self, subject: Subject) -None:99 if subject._state 0 or subject._state 2:100 print(ConcreteObserverB: Reacted to the event)101102103 if __name__ __main__:104 #The client code.105106 subject ConcreteSubject()107108 observer_a ConcreteObserverA()109 subject.attach(observer_a)110111 observer_b ConcreteObserverB()112 subject.attach(observer_b)113114 subject.some_business_logic()115 subject.some_business_logic()116117 subject.detach(observer_a)118119 subject.some_business_logic()适用场景1当一个对象状态的改变需要改变其他对象或实际对象是事先未知的或动态变化的时可使用观察者模式。2当应用中的一些对象必须观察其他对象时可使用该模式。优点符合开闭原则不用修改发布者代码就能引入新的订阅者类。可以在运行时建立对象之间的联系。缺点订阅者的通知顺序是随机的作者Andy出处http://www.cnblogs.com/onepiece-andy/本文版权归作者和博客园共有欢迎转载但未经作者同意必须在文章页面明显位置给出原文连接否则保留追究法律责任的权利。