市裏新修了一個圖書館,如今招募一個圖書管理員叫T,T知道圖書館裏的圖書更新和借閱等信息。如今有三個同窗甲乙丙想去了解之後幾個月的圖書館圖書信息和借閱信息,因而它們去T那裏註冊登記。當圖書館圖書更新後,T就給註冊了的同窗發送圖書更新信息。三個月後,丙不須要知道圖書更新信息了,因而就去T那兒註銷了它的信息。因此,之後,只有甲乙會收到消息。幾個月後,丁也去圖書館註冊了信息,因此之後甲乙丁會收到圖書更新信息。python
當咱們遇到一個多對一
的依賴關係時,就能夠用觀察者模式。觀察者模式有一個
被觀察者(subject
)和多個
觀察者(observer
)。被觀察者提供註冊
、刪除
、通知
的功能,觀察者提供數據更新
和展現
等功能。
上面栗子中,T就是一個被觀察者,T提供了註冊身份信息的功能、刪除信息的功能和給甲乙丙丁發送通知的功能,而甲乙丙丁就是觀察者,更新它們從T那個獲取的信息。app
獨立封裝,互不影響:觀察者和被觀察者都是獨自封裝
好的,觀察者之間並不會相互影響
熱插拔:在軟件運行中,能夠動態
添加和刪除觀察者code
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