(資料圖片)
觀察者模式是一種行為設計模式,它定義了對象之間的一種一對多的依賴關系,當一個對象狀態發生改變時,所有依賴它的對象都將得到通知并自動更新。這種模式也叫做發布-訂閱模式,它能夠解決對象之間的耦合關系。
觀察者模式有三個角色:Subject(主題)、Observer(觀察者)和ConcreteObserver(具體觀察者)。Subject是被觀察的對象,當它的狀態發生改變時,會通知所有觀察它的對象。Observer是觀察者,它定義了接收通知的接口,所有觀察者都實現這個接口。ConcreteObserver是具體的觀察者,它實現了Observer接口,當Subject的狀態發生改變時,它會接收到通知并作出相應的處理。
觀察者模式的優點是可以實現松耦合,即Subject和Observer之間的耦合度很低,它們可以獨立地改變而不會影響到對方。此外,觀察者模式還支持廣播通信,即Subject可以同時通知多個Observer。
下面是一個使用觀察者模式的示例。假設有一個天氣主題,它會隨著天氣的變化通知所有的觀察者。觀察者可以是顯示天氣的頁面或者是發送短信的手機應用程序。
首先,我們需要定義Subject接口,它定義了注冊、移除和通知觀察者的方法:
interface Subject{ public function registerObserver(Observer $observer); public function removeObserver(Observer $observer); public function notifyObservers();}
接下來,我們定義Observer接口,它定義了接收通知的方法:
interface Observer{ public function update($temperature, $humidity, $pressure);}
然后,我們實現具體的Subject類,它維護了一個觀察者列表,當它的狀態發生改變時,會通知所有觀察者::
class WeatherData implements Subject{ private $observers; private $temperature; private $humidity; private $pressure; public function __construct() { $this->observers = array(); } public function registerObserver(Observer $observer) { $this->observers[] = $observer; } public function removeObserver(Observer $observer) { $key = array_search($observer, $this->observers, true); if ($key !== false) { unset($this->observers[$key]); } } public function notifyObservers() { foreach ($this->observers as $observer) { $observer->update($this->temperature, $this->humidity, $this->pressure); } } public function measurementsChanged() { $this->notifyObservers(); } public function setMeasurements($temperature, $humidity, $pressure) { $this->temperature = $temperature; $this->humidity = $humidity; $this->pressure = $pressure; $this->measurementsChanged(); }}
最后,我們實現具體的Observer類,它實現了Observer接口的update方法,當它接收到通知時,會更新自己的狀態:
class CurrentConditionsDisplay implements Observer{ private $temperature; private $humidity; private $pressure; private $weatherData; public function __construct(Subject $weatherData) { $this->weatherData = $weatherData; $this->weatherData->registerObserver($this); } public function update($temperature, $humidity, $pressure) { $this->temperature = $temperature; $this->humidity = $humidity; $this->pressure = $pressure; $this->display(); } public function display() { echo "Current conditions: " . $this->temperature . "F degrees and " . $this->humidity . "% humidity\n"; }}
在這個示例中,WeatherData類是Subject,它維護了一個觀察者列表,并實現了注冊、移除和通知觀察者的方法。CurrentConditionsDisplay類是具體的觀察者,它實現了Observer接口的update方法,當它接收到通知時,會更新自己的狀態并調用display方法顯示當前的天氣信息。
使用觀察者模式的主要步驟如下:
定義Subject接口,其中包含注冊、移除和通知觀察者的方法。定義Observer接口,其中包含接收通知的方法。實現具體的Subject類,維護觀察者列表,并實現注冊、移除和通知觀察者的方法。實現具體的Observer類,實現接收通知的方法并更新自己的狀態。在主程序中,創建具體的Subject和Observer對象,將Observer對象注冊到Subject對象中,當Subject的狀態發生改變時,通知所有注冊的Observer對象。關鍵詞: