觀察者模式也可以理解為:發布訂閱模式
發布者狀態更新,通過管道介面實作訂閱者動態更新
1 class Middleware: 2 """ 3 發布者和訂閱者互動類 4 0、訂閱者容器串列 5 1、包括訂閱者的增加、洗掉 6 2、通過管道通知訂閱者 7 """ 8 9 def __init__(self): 10 self.subscribes = list() 11 12 def attach(self, obs): 13 self.subscribes.extend(obs) 14 15 def detach(self, obs): 16 self.subscribes.remove(obs) 17 18 def notify(self): 19 """遍歷訂閱者,呼叫訂閱者的update方法(訂閱者繼承抽象基類),實作實時更新""" 20 for obs in self.subscribes: 21 obs.update(self) 22 23 24 class Publisher(Middleware): 25 """ 26 發布者角色 27 """ 28 29 def __init__(self, company_info): 30 super().__init__() 31 self.__company_info = company_info 32 33 @property 34 def company_info(self): 35 return self.__company_info 36 37 @company_info.setter 38 def company_info(self, info): 39 self.__company_info = info 40 # 通知訂閱者進行訊息更新 41 self.notify() 42 43 44 """=================================================以上為發布者====================================================""" 45 """=================================================以下為訂閱者====================================================""" 46 47 from abc import ABCMeta, abstractmethod 48 49 50 class Observer(metaclass=ABCMeta): 51 @abstractmethod 52 def update(self, notice): 53 ... 54 55 56 class Subscribe(Observer): 57 """ 58 訂閱者角色 59 """ 60 61 def __init__(self): 62 self.company_info = None 63 64 def update(self, notice): 65 # 將發布者最新訊息賦給訂閱者 66 self.company_info = notice.company_info 67 68 69 if __name__ == '__main__': 70 # 實體化發布者 71 pub = Publisher("藍天計劃") 72 # 實體化訂閱者 73 s1 = Subscribe() 74 s2 = Subscribe() 75 # 添加訂閱者 76 pub.attach([s1, s2]) 77 # 發布者發布訊息 78 pub.company_info = "準備下個月,給開發集體調薪" 79 # 輸出訂閱者訊息,校驗有無更新 80 print(s1.company_info) 81 print(s2.company_info) 82 # # 移除訂閱者s1 83 # pub.detach(s1) 84 # 再次發布訊息 85 pub.company_info = "畫餅?" 86 # 再次輸出訂閱者訊息 87 print(s1.company_info) 88 print(s2.company_info)
output:
準備下個月,給開發集體調薪
準備下個月,給開發集體調薪
畫餅?
畫餅?
只有永不遏止的奮斗,才能使青春之花,即便是凋謝,也是壯麗地凋謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513723.html
標籤:其他
上一篇:草圖?不管黑貓白貓,能快速、有效把你的設計理念講清楚才行
下一篇:初識設計模式 - 享元模式
