python 设计模式 观察者模式(发布订阅模式)
生活随笔
收集整理的這篇文章主要介紹了
python 设计模式 观察者模式(发布订阅模式)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
發(fā)布訂閱模式
觀察者模式應(yīng)用比較廣泛,又被稱為“發(fā)布-訂閱”模式。它用來定義對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴它的對(duì)象都得到通知并被自動(dòng)更新。
問題1
例子為什么要使用“ @property 與 @*.setter ”裝飾器語(yǔ)法?
出于安全與調(diào)用者方便的原因
1.由于為了隱藏發(fā)布者消息被篡改,所以設(shè)置成立私有屬性__
2.設(shè)置私有屬性后,就必須單獨(dú)寫一個(gè)函數(shù)來調(diào)用,一個(gè)屬性卻需要使用函數(shù)的調(diào)用方式,會(huì)讓調(diào)用者迷惑。要使用"@property"裝飾器語(yǔ)法
3.這個(gè)屬性,有時(shí)會(huì)需要調(diào)用者重新賦值,要使用"@*.setter"裝飾器語(yǔ)法
以上的內(nèi)容也是為了演示,在訂閱者名單中,刪除某訂閱者名字后,某訂閱者會(huì)不會(huì)收到新消息。
from abc import ABCMeta, abstractmethod# 抽象的訂閱者 class Observer(metaclass=ABCMeta):@abstractmethoddef update(self, notice):pass# 抽象的發(fā)布者:可以是接口,子類不需要實(shí)現(xiàn),所以不需要定義抽象方法! class Notice:def __init__(self):self.observers = []def attach(self, obs):# 添加 訂閱者名單self.observers.append(obs)def detach(self, obs):# 刪除 訂閱者名單self.observers.remove(obs)def notify(self):# 遍歷訂閱者名單for obs in self.observers:# 使用訂閱者的方法,把發(fā)布者作為參數(shù)輸入obs.update(self)# 具體的發(fā)布者 class StaffNotice(Notice):def __init__(self, company_info):super().__init__() # 調(diào)用父類對(duì)象聲明observers屬性# 設(shè)置了私有屬性self.__company_info = company_info# @property 與 @*.setter 可以配合使用# 既要保護(hù)類的封裝特性,又要讓開發(fā)者可以使用“對(duì)象.屬性”的方式操作操作類屬性,# 通過 @property 裝飾器,可以直接通過方法名來訪問方法,不需要在方法名后添加一對(duì)“()”小括號(hào)。@propertydef company_info(self):# 直接返回 __company_inforeturn self.__company_info# 兩個(gè)同名函數(shù), 當(dāng)company_info這個(gè)"屬性"被賦值時(shí),該函數(shù)會(huì)被執(zhí)行 (預(yù)處理)@company_info.setterdef company_info(self, info):# 更新 __company_infoself.__company_info = info# 調(diào)用發(fā)布者的方法self.notify()# 具體的訂閱者 class Staff(Observer):def __init__(self):self.company_info = Nonedef update(self, notice):# 輸入?yún)?shù).調(diào)用發(fā)布者的方法 賦值給 訂閱者(自己)self.company_info = notice.company_info# 實(shí)例化 發(fā)布者 staff_notice = StaffNotice('初始化公司信息')# 實(shí)例化 訂閱者 staff1 = Staff() staff2 = Staff()# 添加訂閱 staff_notice.attach(staff1) staff_notice.attach(staff2) # print(staff1.company_info) None # print(staff2.company_info) None# 當(dāng)company_info這個(gè)"屬性"被賦值時(shí), 會(huì)觸發(fā)"預(yù)處理" # 訂閱者 會(huì)接收 發(fā)布者 的消息 staff_notice.company_info = '假期放假通知!' print(staff1.company_info) print(staff2.company_info)# 刪除 訂閱者 staff2 staff_notice.detach(staff2)# 重新 發(fā)布訂閱 staff_notice.company_info = '明天開會(huì)!' # staff1 會(huì)接收到新的消息 print(staff1.company_info) # staff2 不會(huì)接收到新的消息 print(staff2.company_info) """ 假期放假通知! 假期放假通知! 明天開會(huì)! 假期放假通知! """總結(jié)
以上是生活随笔為你收集整理的python 设计模式 观察者模式(发布订阅模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用于3D图形制作环境的_JITStac
- 下一篇: 初遇Linux的FHS