python 设计模式 观察者_设计模式Python实现-观察者模式
觀察者模式(發布-訂閱模式 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 importList5
6
7 classSubject(ABC):8 """
9 聲明一組用于管理訂閱者的方法10 """
11
12 @abstractmethod13 def attach(self, observer: Observer) ->None:14 """
15 添加觀察者到subject.16 """
17 pass
18
19 @abstractmethod20 def detach(self, observer: Observer) ->None:21 """
22 從subject刪除觀察者.23 """
24 pass
25
26 @abstractmethod27 def notify(self) ->None:28 """
29 通知觀察者事件的發生.30 """
31 pass
32
33
34 classConcreteSubject(Subject):35 """
36 Subject有一些狀態,狀態變更需要通知觀察者37 """
38 #Subject的狀態,所有的訂閱者都要有,
39 _state: int =None40
41 #訂閱用戶列表
42 _observers: List[Observer] =[]43
44 def attach(self, observer: Observer) ->None:45 print("Subject: Attached an observer.")46 self._observers.append(observer)47
48 def detach(self, observer: Observer) ->None:49 self._observers.remove(observer)50
51 #通知所有訂閱者
52 def notify(self) ->None:53 """
54 通知接口,觸發了所有的訂閱用戶的update方法55 """
56
57 print("Subject: Notifying observers...")58 for observer inself._observers:59 observer.update(self)60
61 def some_business_logic(self) ->None:62 """
63 一些業務邏輯塊,處理業務邏輯后,也可能會觸發狀態的變更,需要調用notify通知所有訂閱者,64 """
65
66 print("\nSubject: state change")67 self._state = randrange(0, 10)68
69 print(f"Subject: My state has changed to: {self._state}")70 self.notify()71
72
73 classObserver(ABC):74 """
75 訂閱者聲明對象使用的update.76 """
77
78 @abstractmethod79 def update(self, subject: Subject) ->None:80 """
81 接收到狀態變更.82 """
83 pass
84
85
86 """
87 具體訂閱者,對狀態的變更做出具體反應88 """
89
90
91 classConcreteObserverA(Observer):92 def update(self, subject: Subject) ->None:93 if subject._state < 3:94 print("ConcreteObserverA: Reacted to the event")95
96
97 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")101
102
103 if __name__ == "__main__":104 #The client code.
105
106 subject =ConcreteSubject()107
108 observer_a =ConcreteObserverA()109 subject.attach(observer_a)110
111 observer_b =ConcreteObserverB()112 subject.attach(observer_b)113
114 subject.some_business_logic()115 subject.some_business_logic()116
117 subject.detach(observer_a)118
119 subject.some_business_logic()
適用場景:
1,當一個對象狀態的改變需要改變其他對象,或實際對象是事先未知的或動態變化的時,可使用觀察者模式。
2,當應用中的一些對象必須觀察其他對象時,可使用該模式。
優點:
符合開閉原則,不用修改發布者代碼就能引入新的訂閱者類。
可以在運行時建立對象之間的聯系。
缺點:
訂閱者的通知順序是隨機的
作者:Andy
出處:http://www.cnblogs.com/onepiece-andy/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python 设计模式 观察者_设计模式Python实现-观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行龙卡MUSE信用卡天使版额度是多少?
- 下一篇: python flask上传文件_Pyt