上文:《PHP設計模式介紹》第八章 迭代器模式
《PHP設計模式介紹》第九章 觀測模式
些面向?qū)ο蟮木幊谭绞,提供了一種構(gòu)建對象間復雜網(wǎng)絡互連的能力。當對象們連接在一起時,它們就可以相互提供服務和信息。
通常來說,當某個對象的狀態(tài)發(fā)生改變時,你仍然需要對象之間能互相通信。但是出于各種原因,你也許并不愿意因為代碼環(huán)境的改變而對代碼做大的修改。也許,你只想根據(jù)你的具體應用環(huán)境而改進通信代碼;蛘,你只想簡單的重新構(gòu)造通信代碼來避免類和類之間的相互依賴與相互從屬。
問題
當一個對象的狀態(tài)發(fā)生改變時,你如何通知其他對象?是否需要一個動態(tài)方案――一個就像允許腳本的執(zhí)行一樣,允許自由連接的方案?
解決方案
觀測模式允許一個對象關注其他對象的狀態(tài),并且,觀測模式還為被觀測者提供了一種觀測結(jié)構(gòu),或者說是一個主體和一個客體。主體,也就是被觀測者,可以用來聯(lián)系所有的觀測它的觀測者?腕w,也就是觀測者,用來接受主體狀態(tài)的改變
觀測就是一個可被觀測的類(也就是主題)與一個或多個觀測它的類(也就是客體)的協(xié)作。不論什么時候,當被觀測對象的狀態(tài)變化時,所有注冊過的觀測者都會得到通知。
觀測模式將被觀測者(主體)從觀測者(客體)種分離出來。這樣,每個觀測者都可以根據(jù)主體的變化分別采取各自的操作。(觀測模式和Publish/Subscribe模式一樣,也是一種有效描述對象間相互作用的模式。)
觀測模式靈活而且功能強大。對于被觀測者來說,那些查詢哪些類需要自己的狀態(tài)信息和每次使用那些狀態(tài)信息的額外資源開銷已經(jīng)不存在了。另外,一個觀測者可以在任何合適的時候進行注冊和取消注冊。你也可以定義多個具體的觀測類,以便在實際應用中執(zhí)行不同的操作。
實例代碼
舉例來說,你可以使用觀測模式為你的PHP腳本來創(chuàng)建一個更靈活的記錄錯誤的句柄。因為,默認的錯誤記錄句柄也許只會在屏幕上顯示一些出錯信息,但是增強后的句柄還可以將出錯信息寫進一個日志文件中,或?qū)⒊鲥e信息寫進系統(tǒng)日志之中,或?qū)⒊鲥e信息通過電子郵件發(fā)送出去,或利用聲音報告出錯信息。你甚至還可以構(gòu)造一種有級別的報錯方案,只允許向那些已經(jīng)為具體的出錯信息注冊過的觀測者報告。從一般的警告信息到像數(shù)據(jù)庫失靈之類的嚴重出錯信息都可以報告。
下面,我們用觀測模式來為PHP創(chuàng)建一系列的類來實現(xiàn)剛才所說的那些功能。新建一個名為ErrorHandler的類, 它就是觀測模式的主體,也就是被觀測者。再建另外兩個名為FileErrorLogger和 EmailErrorLogger的類, 它們是觀測客體(即觀測者)。FileErrorLogger類將出錯信息寫入日志文件,EmailErrorLogger類利用電子郵件發(fā)送出錯信息。在UML中,可以表示如下:
點擊放大
出處:phpchina
責任編輯:bluehearts
上一頁 下一頁 php設計模式介紹之觀測模式 [2]
◎進入論壇網(wǎng)絡編程版塊參加討論
|