Python程序中的觀察者模式結(jié)構(gòu)編寫示例
察者模式定義
定義了對(duì)象之間的一對(duì)多依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴都會(huì)收到通知并自動(dòng)更新。觀察者模式提供了一種對(duì)象設(shè)計(jì),讓主題和觀察者之間松耦合。
設(shè)計(jì)原則
為了交互對(duì)象之間的松耦合設(shè)計(jì)而努力。松耦合的設(shè)計(jì)之所以能讓我們建立有彈性的系統(tǒng),能夠應(yīng)對(duì)變化,是因?yàn)閷?duì)象之間的互相依賴降到了最低。
模式結(jié)構(gòu)與說明

1.Subject:主題(目標(biāo))接口,主題可以注冊(cè)、移除對(duì)其感興趣的觀察者,在自身數(shù)據(jù)發(fā)生變化的時(shí)候,還可以通知這些觀察者。一個(gè)主題可以有多個(gè)觀察者,需要注意的是,觀察者的順序應(yīng)當(dāng)是無關(guān)緊要的。主題也被稱為“被觀察者”(Observable)
2.所有的觀察者必須實(shí)現(xiàn)Observer接口,以便主題狀態(tài)發(fā)生變化時(shí),可以被通知
觀察者模式是一種廣泛使用、非常重要的設(shè)計(jì)模式,它有利于降低對(duì)象間的耦合,同時(shí)讓對(duì)象保持高度協(xié)作。該模式的松耦合特性體現(xiàn)在:
1.關(guān)于觀察者的一切,主題只知道它實(shí)現(xiàn)了觀察者接口,其它一概不知
2.在任何時(shí)候,主題的觀察者可以被動(dòng)態(tài)的添加、刪除
3.當(dāng)新類型的觀察者出現(xiàn)時(shí),主題的代碼不需要進(jìn)行修改
4.修改主題或者觀察者的任一方,對(duì)方不會(huì)受到影響
示例
通過注釋就可以清晰理解~
#observer pattern
class subject():
def __init__(self,dat):
self.listobj = list() #主題中的列表變量用來存儲(chǔ)觀察者
self.dat = dat #主題中的數(shù)據(jù)變化時(shí),需要通知觀察者
def registerObject(self,obj):
self.listobj.append(obj) #實(shí)現(xiàn)訂閱主題的函數(shù)
def removeObject(self,obj):
pass
def notifyObservers(self):#通知各個(gè)觀察者數(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): #觀察者初始化時(shí),需要訂閱主題
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)文章
Pyecharts 中Geo函數(shù)常用參數(shù)的用法說明
這篇文章主要介紹了Pyecharts 中Geo函數(shù)常用參數(shù)的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Python測(cè)試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決
這篇文章主要介紹了Python測(cè)試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python3使用requests登錄人人影視網(wǎng)站的方法
通過本文給大家介紹python代碼實(shí)現(xiàn)使用requests登錄網(wǎng)站的過程。非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
python網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)
實(shí)踐來源于理論,做爬蟲前肯定要先了解相關(guān)的規(guī)則和原理,網(wǎng)絡(luò)爬蟲又稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,更經(jīng)常的稱為網(wǎng)頁追逐者,是一種按照一定的規(guī)則,自動(dòng)地抓取萬維網(wǎng)信息的程序或者腳本。一句話概括就是網(wǎng)上信息搬運(yùn)工。本篇文章帶你深入了解,需要的朋友可以參考下2021-09-09
對(duì)python append 與淺拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)python append 與淺拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問題
本文主要介紹了解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
為Python的Tornado框架配置使用Jinja2模板引擎的方法
Jinja2是人氣Web框架Flask中的內(nèi)置模板引擎,而且與Django的模板引擎比較類似,這里我們就來看一下為Python的Tornado框架配置使用Jinja2模板引擎的方法2016-06-06
Python預(yù)測(cè)分詞的實(shí)現(xiàn)
本文將結(jié)合實(shí)例代碼,介紹Python預(yù)測(cè)分詞的實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
python抓取網(wǎng)頁內(nèi)容并進(jìn)行語音播報(bào)的方法
今天小編就為大家分享一篇python抓取網(wǎng)頁內(nèi)容并進(jìn)行語音播報(bào)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則
這篇文章主要介紹了總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則,本文講解了每個(gè)函數(shù)只做一件事、保持簡(jiǎn)單、保持簡(jiǎn)短、輸入使用參數(shù)、輸出使用return語句等內(nèi)容,需要的朋友可以參考下2015-06-06

