觀察者模式的用途和處理異常信息的方法

觀察者模式的使用具有廣泛性今野。是一種java設計模式。觀察者模式的定義是定義對象間一種一對多的依賴關系罐农,是的沒當一個對象改變狀態(tài)条霜,則所有依賴于它的對象都會得到通知并自動更新。

二.觀察者模式的使用場景

(1).關聯(lián)行為場景涵亏,需要注意的是宰睡,關聯(lián)行為是可拆分的,而不是“組合”關系

(2).事件多級觸發(fā)場景

(3).跨系統(tǒng)的消息交換場景气筋,如消息隊列拆内,事件總線的處理機制。

三.觀察者模式的UML類圖

角色介紹:

subject:抽象主題(Observer)宠默,也就是被觀察observable的角色麸恍,抽象主題角色把所有觀察者對象的引用保存在一個集合里,每個主題都可以有任意數(shù)量的觀察者搀矫,抽象主題提供一個接口抹沪,可以增加或刪除觀察者對象。

concreteSubject:具體主題(ConcreteObservable)瓤球,該角色將有關狀態(tài)存入具體觀察對象,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時冰垄,給所有注冊過的觀察者發(fā)出通知蹬癌,具體主題角色又叫具體被觀察這(ConcreteObservable)角色

observale:抽象觀察者,該角色是觀察者的抽象類虹茶,它定義了更新接口虏肾,使得在得到主題的更改通知時更新自己吹埠。

ConcreteObserver:具體的觀察者第步,該角色實現(xiàn)抽象觀察者角色所定義的更新接口,以便在主題的狀態(tài)發(fā)生變化時更新自身的狀態(tài)缘琅。


異常信息的捕獲對編程測試有著重要的意義粘都,這里結合觀察者模式,探索如何處理異常信息刷袍。

筆者覺得翩隧,所謂觀察者模式,必須有兩個重要組成部分:一個主題對象呻纹,多個觀察者堆生。在使用的時候,我們可以將觀察者像插頭一樣插到主題對象這個插座上雷酪,利用主題對象完成相應功能顽频。既然觀察者要作為插頭,必須要有一個統(tǒng)一的口徑才能插到相同的插座上太闺,因而先定義一個接口糯景,Exception_Observer.php:


<?php?

/**

?* 定義的規(guī)范?

?*/

interface Exception_Observer{

? ? public function update(Observer_Exception $e);

}


??>


我們可以清楚地看到,靜態(tài)變量$_observers用來放置插入的觀察者省骂,notify()用來通知所有觀察者對象蟀淮。這里需要注意 $observer->update($this); 里面 $this 的用法,很多初學者會感到“原來 $this 也可以這么用啊”钞澳。一個小問題: $_observers 不是靜態(tài)變量可不可以怠惶? 這個問題我們后面回答。

定義兩個觀察者轧粟,原則上實現(xiàn)接口所定義的功能策治。



設計完所有該有的主體對象和插件,我們做個小小的測試:


<?php?


require 'Exception_Observer.php';

require 'Observer_Exception.php';

require 'Logging_Exception_Observer.php';

require 'Emailing_Exception_Observer.php';


Observer_Exception::attach(new Logging_Exception_Observer());


class MyException extends Observer_Exception{


? ? public function test(){

? ? ? ? echo 'this is ?a test';

? ? }

? ? public function test1(){


? ? ? ? echo "我是自定義的方法處理這個異常";

? ? }


}


try {

? ? throw new MyException("出現(xiàn)異常兰吟,記錄一下"); ? ?

} catch (MyException $e) {

? ? echo $e->getMessage();

? ? echo "<ht/>"; ? ?

}

?>


本實例首先先加載觀察者通惫,其后進行其他操作』彀回到上面提出的問題履腋, $_observers 可以不是靜態(tài)變量嗎?答案是不可以。如果 $_observers 不是靜態(tài)變量遵湖,加載觀察者的行為對后續(xù)操作沒有影響悔政。static讓所有實例成員共享某個變量。即便類繼承也同樣有效延旧。有興趣的可以繼續(xù)探索下static的神奇作用吧谋国。

本例顯示輸出與一般情況無異,但不同的是已在自定義的文件下生成了相應的日志迁沫。雖然最后實現(xiàn)的功能再簡單不過烹卒,很多人甚至可以用更少的代碼更簡單的方法實現(xiàn),但是弯洗,在實現(xiàn)更加復雜系統(tǒng)的情況下,觀察者模式給我們帶來很大方便逢勾。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牡整,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溺拱,更是在濱河造成了極大的恐慌逃贝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迫摔,死亡現(xiàn)場離奇詭異沐扳,居然都是意外死亡,警方通過查閱死者的電腦和手機句占,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門沪摄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纱烘,你說我怎么就攤上這事杨拐。” “怎么了擂啥?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵哄陶,是天一觀的道長。 經(jīng)常有香客問我哺壶,道長屋吨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任山宾,我火速辦了婚禮至扰,結果婚禮上,老公的妹妹穿的比我還像新娘资锰。我一直安慰自己渊胸,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布台妆。 她就那樣靜靜地躺著翎猛,像睡著了一般胖翰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上切厘,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天萨咳,我揣著相機與錄音,去河邊找鬼疫稿。 笑死培他,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的遗座。 我是一名探鬼主播舀凛,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼途蒋!你這毒婦竟也來了猛遍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤号坡,失蹤者是張志新(化名)和其女友劉穎懊烤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宽堆,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腌紧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畜隶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁肋。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖籽慢,靈堂內(nèi)的尸體忽然破棺而出墩划,到底是詐尸還是另有隱情,我是刑警寧澤嗡综,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布乙帮,位于F島的核電站,受9級特大地震影響极景,放射性物質(zhì)發(fā)生泄漏察净。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一盼樟、第九天 我趴在偏房一處隱蔽的房頂上張望氢卡。 院中可真熱鬧,春花似錦晨缴、人聲如沸译秦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筑悴。三九已至们拙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阁吝,已是汗流浹背砚婆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留突勇,地道東北人装盯。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像甲馋,于是被迫代替她去往敵國和親埂奈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容