摘要:所以,以后,只有甲乙會收到消息。原理當我們遇到一個多對一的依賴關系時,就可以用觀察者模式。觀察者模式有一個被觀察者和多個觀察者。被觀察者提供注冊刪除通知的功能,觀察者提供數據更新和展示等功能。
1.白話栗子
市里新修了一個圖書館,現在招募一個圖書管理員叫T,T知道圖書館里的圖書更新和借閱等信息?,F在有三個同學甲乙丙想去了解以后幾個月的圖書館圖書信息和借閱信息,于是它們去T那里注冊登記。當圖書館圖書更新后,T就給注冊了的同學發送圖書更新信息。三個月后,丙不需要知道圖書更新信息了,于是就去T那兒注銷了它的信息。所以,以后,只有甲乙會收到消息。幾個月后,丁也去圖書館注冊了信息,所以以后甲乙丁會收到圖書更新信息。
2.原理當我們遇到一個多對一的依賴關系時,就可以用觀察者模式。觀察者模式有一個被觀察者(subject)和多個觀察者(observer)。被觀察者提供注冊、刪除、通知的功能,觀察者提供數據更新和展示等功能。
上面栗子中,T就是一個被觀察者,T提供了注冊身份信息的功能、刪除信息的功能和給甲乙丙丁發送通知的功能,而甲乙丙丁就是觀察者,更新它們從T那個獲取的信息。
獨立封裝,互不影響:觀察者和被觀察者都是獨自封裝好的,觀察者之間并不會相互影響
熱插拔:在軟件運行中,可以動態添加和刪除觀察者
class Subject(object): def __init__(self): self._observers = [] #觀察者列表 #注冊功能 def attach(self, observer): if observer not in self._observers: self._observers.append(observer) #刪除功能 def delete(self, observer): try: self._observers.remove(observer) except ValueError: pass #通知功能 def notify(self, modifier=None): for observer in self._observers: if modifier != observer: observer.update(self) #被觀察者數據來源 class Data(Subject): def __init__(self, name=""): Subject.__init__(self) self.name = name self._data = 0 @property def data(self): return self._data @data.setter def data(self, value): self._data = value self.notify() #觀察者 class Viewer: def __init__(self, name=""): self._name = name def update(self, subject): print("my name is ", self._name, "and", subject.name, "***", subject.data) if __name__ == "__main__": data1 = Data("管理員T") view1 = Viewer("甲") data1.attach(view1) view2 = Viewer("乙") data1.attach(view2) view3 = Viewer("丙") data1.attach(view3) print("data1初始值") print(data1.data) print("改變data1的值") data1.data = 5 print("再次改變data1的值") data1.data = 10 print("刪除view3后") data1.delete(view3) data1.data = 90
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44799.html
摘要:在程序設計中,觀察者模式通常被定義為觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態是,它的所有依賴者都會收到通知并自動更新。事件扮演發布者的角色,監聽者則扮演觀察者的角色。 題目:現在你有一個數字,默認格式化程序是以十進制格式展示此數值,但需要提供一個功能,這個程序要支持添加/注冊更多的格式化程序(比如:添加一個十六進制格式化程序和一個二進制格式化程序)。每次數值...
摘要:監聽模式又名觀察者模式發布訂閱模式源監聽器模式,模式的核心是設計時要區分誰是被觀察者,誰是觀察者。 監聽模式 又名觀察者模式、發布/訂閱模式、源-監聽器(Source/Listener)模式,模式的核心是:設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,添加觀察者、刪除觀察者、監聽目標變化并通知觀察者;觀察者這至少包含一個方法,當接收到被觀察者的通知時,做出相應的處理(即...
摘要:在本節實驗中,我們學習了四種設計模式策略模式,觀察者模式,命令模式以及模板方法模式。這四種設計模式都是行為型模式。這就是適配器模式。下面讓我們看看適配器模式在實驗樓中使用吧。準確來說,裝飾者模式能動態的給對象添加行為。 1、策略模式 策略模式將各種操作(算法)進行封裝,并使它們之間可以互換。互換的意思是說可以動態改變對象的操作方式(算法)。 -- coding: utf-8 -- im...
摘要:借助繼承為對象安裝發布訂閱功能根據自己需求定義一個函數供事件處理完后調用創建個回調函數訂閱和這個事件,并且綁定相關的完成后的函數當兩個事件完成時候,觸發前幾行綁定的相關函數打印實現中一般用事件模型來代替傳統的發布訂閱模式。 博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現。誠然,每種設計模式都...
摘要:借助繼承為對象安裝發布訂閱功能根據自己需求定義一個函數供事件處理完后調用創建個回調函數訂閱和這個事件,并且綁定相關的完成后的函數當兩個事件完成時候,觸發前幾行綁定的相關函數打印實現中一般用事件模型來代替傳統的發布訂閱模式。 博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現。誠然,每種設計模式都...
閱讀 2750·2021-10-26 09:50
閱讀 2391·2021-10-11 11:08
閱讀 2132·2019-08-30 15:53
閱讀 1910·2019-08-30 15:44
閱讀 2386·2019-08-28 18:12
閱讀 2525·2019-08-26 13:59
閱讀 2858·2019-08-26 12:19
閱讀 2757·2019-08-26 12:09