定義:html
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴的對象都會獲得通知並被自動更新。app
觀察者模式是對象的行爲模式,又叫發佈-訂閱(pubish/subscribe)模式,模型-視圖(Model/View模式),源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。運維
角色:測試
抽象主題,具體主題(發佈者), 抽象觀察者,具體觀察者(訂閱者)spa
適用場景:設計
當一個抽象模型有兩個方面,其中一個方面依賴於另外一個方面.將二者封裝在獨立的對象中以使它們各自獨立的改變和複用code
當一個對象的改變須要同時改變其餘對象,並且不知道具體有多少對象以待改變server
當一個對象必須通知其餘對象,而又不知道其餘對象是誰,即這些對象之間是解耦的htm
優勢:對象
目標與觀察者之間的耦合最小
缺點:
多個觀察者之間互不知道對方的存在,所以一個觀察者對主題的修改可能形成錯誤的更新
好, 概念說完來實際場景,以我目前公司業務爲背景,產品上線後常常會收到用戶反饋bug。那麼一般由運營同事收集bug-》開發修復bug-》測試驗證bug-》運維發佈新版本到線上
直接上代碼:
class OBperson(): '抽象觀察者' def updata(self): pass class 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