Python程序中的觀察者模式結(jié)構(gòu)編寫示例
察者模式定義
定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態(tài)時,它的所有依賴都會收到通知并自動更新。觀察者模式提供了一種對象設(shè)計,讓主題和觀察者之間松耦合。
設(shè)計原則
為了交互對象之間的松耦合設(shè)計而努力。松耦合的設(shè)計之所以能讓我們建立有彈性的系統(tǒng),能夠應(yīng)對變化,是因為對象之間的互相依賴降到了最低。
模式結(jié)構(gòu)與說明
1.Subject:主題(目標)接口,主題可以注冊、移除對其感興趣的觀察者,在自身數(shù)據(jù)發(fā)生變化的時候,還可以通知這些觀察者。一個主題可以有多個觀察者,需要注意的是,觀察者的順序應(yīng)當是無關(guān)緊要的。主題也被稱為“被觀察者”(Observable)
2.所有的觀察者必須實現(xiàn)Observer接口,以便主題狀態(tài)發(fā)生變化時,可以被通知
觀察者模式是一種廣泛使用、非常重要的設(shè)計模式,它有利于降低對象間的耦合,同時讓對象保持高度協(xié)作。該模式的松耦合特性體現(xiàn)在:
1.關(guān)于觀察者的一切,主題只知道它實現(xiàn)了觀察者接口,其它一概不知
2.在任何時候,主題的觀察者可以被動態(tài)的添加、刪除
3.當新類型的觀察者出現(xiàn)時,主題的代碼不需要進行修改
4.修改主題或者觀察者的任一方,對方不會受到影響
示例
通過注釋就可以清晰理解~
#observer pattern class subject(): def __init__(self,dat): self.listobj = list() #主題中的列表變量用來存儲觀察者 self.dat = dat #主題中的數(shù)據(jù)變化時,需要通知觀察者 def registerObject(self,obj): self.listobj.append(obj) #實現(xiàn)訂閱主題的函數(shù) def removeObject(self,obj): pass def notifyObservers(self):#通知各個觀察者數(shù)據(jù)已經(jīng)發(fā)生變化,觀察者相應(yīng)需要更新自己的數(shù)據(jù) for i in range(len(self.listobj)): self.listobj[i].update() def setdat(self,new_dat):#設(shè)置數(shù)據(jù) if self.dat != new_dat: self.dat = new_dat self.notifyObservers() class observer():#觀察者 def __init__(self,sub): #觀察者初始化時,需要訂閱主題 self.sub = sub self.sub.registerObject(self) self.number = self.sub.dat def update(self):#觀察者更新 self.number = self.sub.dat def display(self): print self.number if __name__ =="__main__": su = subject(10) ob1 = observer(su) ob1.display() ob2 = observer(su) ob2.display() su.setdat(11) ob1.display() ob2.display()
相關(guān)文章
python hash每次調(diào)用結(jié)果不同的原因
這篇文章主要介紹了python hash每次調(diào)用結(jié)果不同的原因,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11