察者模式定義
定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴都會收到通知並自動更新。觀察者模式提供了一種物件設計,讓主題和觀察者之間鬆散耦合。
設計原則
為了互動物件之間的鬆散耦合設計而努力。松耦合的設計之所以能讓我們建立一個有彈性的系統,能夠應付變化,是因為物件之間的相互依賴降到了最低。
模式結構與說明
#1.Subject:主題(目標)接口,主題可以註冊、移除對其感興趣的觀察者,在自身數據改變的時候,還可以通知這些觀察者。一個主題可以有多個觀察者,需要注意的是,觀察者的順序應該是無關緊要的。主題也被稱為「被觀察者」(Observable)
2.所有的觀察者必須實現Observer接口,以便主題狀態發生變化時,可以被通知
觀察者模式是一種廣泛使用、非常重要的設計模式,它有利於降低物件間的耦合,同時讓物件保持高度協作。此模式的鬆散耦合特性體現在:
1.關於觀察者的一切,主題只知道它實現了觀察者接口,其它一概不知
2.在任何時候,主題的觀察者可以被動態的新增、刪除
3.當新類型的觀察者出現時,主題的程式碼不需要進行修改
4.修改主題或觀察者的任一方,對方不會受到影響
#範例
透過註解可以清楚地理解~
#observer pattern class subject(): def __init__(self,dat): self.listobj = list() #主题中的列表变量用来存储观察者 self.dat = dat #主题中的数据变化时,需要通知观察者 def registerObject(self,obj): self.listobj.append(obj) #实现订阅主题的函数 def removeObject(self,obj): pass def notifyObservers(self):#通知各个观察者数据已经发生变化,观察者相应需要更新自己的数据 for i in range(len(self.listobj)): self.listobj[i].update() def setdat(self,new_dat):#设置数据 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()
更多Python程式中的觀察者模式結構撰寫相關文章請關注PHP中文網!