日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 设计模式 观察者_设计模式Python实现-观察者模式

發布時間:2023/12/13 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现-观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。