python设计模式-观察者
定義:
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴的對象都會得到通知并被自動更新。
觀察者模式是對象的行為模式,又叫發布-訂閱(pubish/subscribe)模式,模型-視圖(Model/View模式),源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。
角色:
抽象主題,具體主題(發布者), 抽象觀察者,具體觀察者(訂閱者)
適用場景:
當一個抽象模型有兩個方面,其中一個方面依賴于另一個方面.將兩者封裝在獨立的對象中以使它們各自獨立的改變和復用
? ? ? ? ? ? ? ?當一個對象的改變需要同時改變其他對象,而且不知道具體有多少對象以待改變
???????????????當一個對象必須通知其他對象,而又不知道其他對象是誰,即這些對象之間是解耦的
優點:
目標與觀察者之間的耦合最小
缺點:
多個觀察者之間互不知道對方的存在,因此一個觀察者對主題的修改可能造成錯誤的更新
?
好, 概念說完來實際場景,以我目前公司業務為背景,產品上線后經常會收到用戶反饋bug。那么通常由運營同事收集bug-》開發修復bug-》測試驗證bug-》運維發布新版本到線上
直接上代碼:
class OBperson():'抽象觀察者'def updata(self):passclass TestOB(OBperson):'具體觀察者'def updata(self):print('I am tester, Verification bug')class Devob(OBperson):'具體觀察者'def updata(self):print('i am developing , Fix bug')class Announcerob(OBperson):'具體觀察者'def updata(self):print('i am announcer, release new version')class OBperation():'具體發布者'def __init__(self):self.__observers = []def collect_bug(self):print('Number of bugs collected : ')self.notifyObserver()def addOBserver(self, observer):self.__observers.append(observer)def removeOBserver(self, observer):self.__observers.remove(observer)def notifyObserver(self):for ob in self.__observers:ob.updata()if __name__ == '__main__':p = OBperation()p.addOBserver(Devob())p.addOBserver(TestOB())p.addOBserver(Announcerob())p.collect_bug()?
運行結果:
?
?設計要點:
被觀察者至少需要有三個方法:添加監聽者, 移除監聽者, 通知OBserver的方法,觀察者至少要有一個方法:更新方法,更新當前內容,
并作出相應處理
推模型和拉模型:
觀察者模式根據其側重的功能還可以分為推模型和拉模型。
推模型:被觀察者對象向觀察者推送主題的詳細信息,不管觀察者是否需要,推送的信息通常是主題對象的全部或部分數據。一般這種模型的實現中,會把被觀察者對象中的全部或部分信息通過 update 的參數傳遞給觀察者 [update(Object obj) ,通過 obj 參數傳遞]。
拉模型:被觀察者在通知觀察者的時候,只傳遞少量信息。如果觀察者需要更具體的信息,由觀察者主動到被觀察者對象中獲取,相當于是觀察者從被觀察者對象中拉數據。一般這種模型的實現中,會把被觀察者對象自身通過 update 方法傳遞給觀察者 [update(Observable observable ),通過 observable 參數傳遞 ],這樣在觀察者需要獲取數據的時候,就可以通過這個引用來獲取了。
?
轉載于:https://www.cnblogs.com/zztxiaodeng/p/10777331.html
總結
以上是生活随笔為你收集整理的python设计模式-观察者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arcgis api for javas
- 下一篇: 10-Flink集群的高可用(搭建篇补充