設計模式 觀察者模式

2021-10-08 10:50:42 字數 2602 閱讀 3267

這個設計模式很常用、重要, 所以要好好看。這是乙個非常經典的設計模式, 解決了不少問題, 在實際專案中應用比較廣泛。

先簡單說一下設計模式的定義: 一旦主體物件狀態發生改變,與之關聯的觀察者物件會收到通知,並進行相應操作。觀察者模式實現了低耦合,非侵入式的通知與更新機制。

舉個?, 大家都知道, 今年的豬肉**讓人有望而卻步, 讓原本就不富裕的家庭更是雪上加霜, 我有個想法就是, 讓這個超市豬肉**一降價就通知我, 好讓我能及時以較低**購買。 我這個時候我就需要觀察者, 來觀察豬肉的**, 然後及時通知我。

<?php

/** * created by 憧憬.

*//**

* 觀察者約束

* inte***ce observer

*/inte***ce observer

/** * 被觀察者 到時候也好通知觀察者

* inte***ce observable

*/inte***ce observable

/////**

// * 豬肉

// * class pork

// */

//class pork implements observable

//// public function deleteobserver(observer $observer)

//

// }

// }

//// public function notifyobserver()

//

// }

//// /**

// * 設定豬肉**

// * @param $price

// * @author: 憧憬

// */

// public function setprice($price)

//

////}

///**

* 博主自己

* class aoppp

*/class aoppp implements observer

}/**

* 李四也想吃豬肉

* class lisi

*/class lisi implements observer

}//$pork = new pork();

////$pork->addobserver(new aoppp());

//$pork->addobserver(new lisi());

//$pork->setprice(100);

/** * 這個時候你發現 可以隨便通知任何人, 也可以移除觀察者 但是每個想觀察的物件都要寫這個函式 有點重複

* 我們可以抽離出來

*/class observerutil implements observable

public function deleteobserver(observer $observer)}}

public function notifyobserver()

}}/**

* 將豬肉類改為繼承

* class pork

*/class pork extends observerutil

}$pork = new pork();

$pork->addobserver(new aoppp());

$pork->addobserver(new lisi());

$pork->setprice(100);

// 這樣的話 你要監聽雞肉 還是什麼亂七八糟的 都要方便很多了

觀察者模式在實際專案的應用中非常常見,比如你到atm機器上取錢,多次輸錯密碼,卡就會被atm吞掉,吞卡動作發生的時候,會觸發哪些事件呢?第一攝像頭連續快拍,第二,通知監控系統,吞卡發生; 第三,初始化atm機螢幕,返回最初狀態,你不能因為就吞了一張卡,整個atm都不能用了吧,一般前兩 個動作都是通過觀察者模式來完成的。

這個設計模式之後變種了乙個發布/訂閱的模式, 這個設計模式也是比較容易理解, 大家可以去了解下。

那觀察者模式在什麼情況下使用呢?觀察者可以實現訊息的廣播,乙個訊息可以觸發多個事件,這是 觀察者模式非常重要的功能。使用觀察者模式也有兩個重點問題要解決:

如果你做過資料庫的觸發器,你就應該知道有乙個觸發器鏈的問題,比如表 a 上寫了 乙個觸發器,內容是乙個字段更新後更新表 b 的一條資料,而表 b 上也有個觸發器,要更新表 c,表 c 也有觸發器...,完蛋了,這個資料庫基本上就毀掉了!我們的觀察者模式也是一樣的問題,乙個觀察者可以有雙 重身份,即使觀察者,也是被觀察者,這沒什麼問題呀,但是鏈一旦建立,這個邏輯就比較複雜,可維護性非常差,根據經驗建議,在乙個觀察者模式中最多出現乙個物件既是觀察者也是被觀察者,也就是說消 息最多**一次(傳遞兩次),這還是比較好控制的;

被觀察者發生動作了,觀察者要做出回應,如果觀察者比較多,而且處理時間比較長怎麼辦?那就用非同步唄,非同步處理就要考慮執行緒安全和佇列的問題,這個 大家有時間看看 message queue,就會有更深的了解。

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...

設計模式 觀察者模式

觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...

設計模式 觀察者模式

核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...