物件間的聯動 觀察者模式(一)

2021-07-04 22:05:19 字數 1318 閱讀 4256

觀察者模式是設計模式中的「超級模式」,其應用隨處可見,在之後幾篇文章裡,我將向大家詳細介紹觀察者模式。「紅燈停,綠燈行」,在日常生活中,交通訊號燈裝點著我們的城市,指揮著日益擁擠的城市交通。當紅燈亮起,來往的汽車將停止;而綠燈亮起,汽車可以繼續前行。在這個過程中,交通訊號燈是汽車(更準確地說應該是汽車駕駛員)的觀察目標,而汽車是觀察者。隨著交通訊號燈的變化,汽車的行為也將隨之而變化,一盞交通訊號燈可以指揮多輛汽車。如圖22-1所示:

圖22-1  交通訊號燈與汽車示意圖

在軟體系統中,有些物件之間也存在類似交通訊號燈和汽車之間的關係,乙個物件的狀態或行為的變化將導致其他物件的狀態或行為也發生改變,它們之間將產生聯動,正所謂「觸一而牽百發」。為了更好地描述物件之間存在的這種一對多(包括一對一)的聯動,觀察者模式應運而生,它定義了物件之間一種一對多的依賴關係,讓乙個物件的改變能夠影響其他物件。本章我們將學習用於實現物件間聯動的觀察者模式。

sunny軟體公司欲開發一款多人聯機對戰遊戲(類似魔獸世界、星際爭霸等遊戲),在該遊戲中,多個玩家可以加入同一戰隊組成聯盟,當戰隊中某一成員受到敵人攻擊時將給所有其他盟友傳送通知,盟友收到通知後將作出響應。

sunny軟體公司開發人員需要提供乙個設計方案來實現戰隊成員之間的聯動。

sunny軟體公司開發人員通過對系統功能需求進行分析,發現在該系統中戰隊成員之間的聯動過程可以簡單描述如下:

聯盟成員受到攻擊-->傳送通知給盟友-->盟友作出響應

如果按照上述思路來設計系統,由於聯盟成員在受到攻擊時需要通知他的每乙個盟友,因此每個聯盟成員都需要持有其他所有盟友的資訊,這將導致系統開銷較大,因此sunny公司開發人員決定引入乙個新的角色——「戰隊控制中心」——來負責維護和管理每個戰隊所有成員的資訊。當乙個聯盟成員受到攻擊時,將向相應的戰隊控制中心傳送求助資訊,戰隊控制中心再逐一通知每個盟友,盟友再作出響應,如圖22-2所示:

圖22-2   多人聯機對戰遊戲中物件的聯動

在圖22-2中,受攻擊的聯盟成員將與戰隊控制中心產生聯動,戰隊控制中心還將與其他盟友產生聯動。

如何實現物件之間的聯動?如何讓乙個物件的狀態或行為改變時,依賴於它的物件能夠得到通知並進行相應的處理?

別著急,本章所介紹的觀察者模式將為物件之間的聯動提供乙個優秀的解決方案,下面就讓我們正式進入觀察者模式的學習。

物件間的聯動 觀察者模式(一)

觀察者模式是設計模式中的 超級模式 其應用隨處可見,在之後幾篇文章裡,我將向大家詳細介紹觀察者模式。紅燈停,綠燈行 在日常生活中,交通訊號燈裝點著我們的城市,指揮著日益擁擠的城市交通。當紅燈亮起,來往的汽車將停止 而綠燈亮起,汽車可以繼續前行。在這個過程中,交通訊號燈是汽車 更準確地說應該是汽車駕駛...

python觀察者模式 python 觀察者模式

python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...

觀察者模式

觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...