首頁>焦點 > 正文

      PHP面向對象的設計模式-觀察者模式|環球頭條

      2023-04-29 14:22:09    出處:騰訊云


      (資料圖片)

      一、概述

      觀察者模式是一種行為設計模式,它定義了對象之間的一種一對多的依賴關系,當一個對象狀態發生改變時,所有依賴它的對象都將得到通知并自動更新。這種模式也叫做發布-訂閱模式,它能夠解決對象之間的耦合關系。

      觀察者模式有三個角色:Subject(主題)、Observer(觀察者)和ConcreteObserver(具體觀察者)。Subject是被觀察的對象,當它的狀態發生改變時,會通知所有觀察它的對象。Observer是觀察者,它定義了接收通知的接口,所有觀察者都實現這個接口。ConcreteObserver是具體的觀察者,它實現了Observer接口,當Subject的狀態發生改變時,它會接收到通知并作出相應的處理。

      觀察者模式的優點是可以實現松耦合,即Subject和Observer之間的耦合度很低,它們可以獨立地改變而不會影響到對方。此外,觀察者模式還支持廣播通信,即Subject可以同時通知多個Observer。

      二、示例

      下面是一個使用觀察者模式的示例。假設有一個天氣主題,它會隨著天氣的變化通知所有的觀察者。觀察者可以是顯示天氣的頁面或者是發送短信的手機應用程序。

      定義Subject接口

      首先,我們需要定義Subject接口,它定義了注冊、移除和通知觀察者的方法:

      interface Subject{    public function registerObserver(Observer $observer);    public function removeObserver(Observer $observer);    public function notifyObservers();}

      定義Observer接口

      接下來,我們定義Observer接口,它定義了接收通知的方法:

      interface Observer{    public function update($temperature, $humidity, $pressure);}

      實現具體的Subject

      然后,我們實現具體的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類,它實現了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對象。

      關鍵詞:

      消費
      產業
      2023中華張姓拜祖大典舉行 4月28日上午,2023中華張姓拜祖大典在中華張姓祖根地河南省濮陽縣揮公陵園如期舉行。2
      中璜新材木飾面:添置精致家居裝飾美學 中璜新材木飾面是一家專業的家居裝飾公司,他們的產品旨在為家庭提供精致的家居裝飾美
      高效記錄等你來體驗,科大訊飛智能錄音筆值得擁有 打工人的世界里永遠充滿著激烈的競爭,這對于新人來說是極具挑戰的。新人上崗,除了熟
      尊守道酒|因尊而守 因道而成——“自己人喝的好醬酒” 因尊而守,因道而成,尊守道酒,尊天而守天道,尊地而守地道,尊人而守人道,天地人和
      基金
      亚洲黄网在线观看| 亚洲日本在线观看视频| 国产精品亚洲专区在线观看| 亚洲男人天堂2017| 亚洲av最新在线网址| 666精品国产精品亚洲| 亚洲AV成人无码久久精品老人| 久久精品九九亚洲精品天堂| 久久精品亚洲男人的天堂| 亚洲AV无码乱码在线观看性色扶 | 亚洲精品高清国产一久久| 在线A亚洲老鸭窝天堂| 亚洲一区二区三区乱码A| 国产福利电影一区二区三区,亚洲国模精品一区 | 蜜芽亚洲av无码精品色午夜| 亚洲福利在线视频| 亚洲色图视频在线观看| 亚洲成无码人在线观看| 亚洲国产成人精品无码区在线秒播| 亚洲成aⅴ人在线观看| 亚洲人成电影在线观看青青| 亚洲一线产区二线产区精华| 亚洲一区二区三区久久| 亚洲午夜无码毛片av久久京东热| 亚洲一线产品二线产品| 亚洲AV无码XXX麻豆艾秋| gogo全球高清大胆亚洲| 亚洲性一级理论片在线观看| 亚洲国产av一区二区三区丶| 色偷偷亚洲女人天堂观看欧| 亚洲精品女同中文字幕| 国产精品亚洲精品日韩电影| 亚洲人成电影网站国产精品| 久久久青草青青国产亚洲免观| 亚洲人成网亚洲欧洲无码久久| 亚洲成A人片在线观看WWW| 亚洲成年轻人电影网站www| 亚洲美女视频免费| 亚洲人成www在线播放| 亚洲av永久无码| 不卡一卡二卡三亚洲|