摘要:觀察者模式就像訂閱報(bào)紙,知識(shí)名稱不太一樣出版社改為主題,訂閱者稱為觀察者。觀察者模式在對(duì)象之間定義一對(duì)多的依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴他的對(duì)象就會(huì)收到通知,并自動(dòng)更新。觀察者模式定義了對(duì)象之間的一對(duì)多關(guān)系。
[TOC]
依賴注入 策略模式 單例模式 觀察者模式 觀察者模式我們來看看報(bào)紙和雜志的訂閱是怎么回事:
報(bào)社的業(yè)務(wù)就是出版報(bào)紙。
向某家報(bào)社訂閱報(bào)紙,只要他們有新報(bào)紙出版,就會(huì)給你送來。
當(dāng)你不想再看報(bào)紙的時(shí)候,取消訂閱,他們就不會(huì)再送新報(bào)紙來。
只要報(bào)社還再運(yùn)營(yíng),就會(huì)一直有人向他們訂閱報(bào)紙或者取消訂閱報(bào)紙。
觀察者模式就像訂閱報(bào)紙,知識(shí)名稱不太一樣:出版社改為“主題”(Subject),訂閱者稱為“觀察者”(Observer)。實(shí)現(xiàn)觀察者模式的方式不只一種,但是包含Subject和Observer接口的類設(shè)計(jì)的做法最常見。
主題可以注冊(cè)、注銷觀察者,當(dāng)數(shù)據(jù)改變時(shí),可以通知觀察者;所有的觀察者必須繼承觀察者接口,這個(gè)接口只有一個(gè)update()方法,當(dāng)主題的狀態(tài)被改變時(shí)調(diào)用。主題繼承 SplSubject,這個(gè)是PHP內(nèi)置觀察者模式主題接口;觀察者繼承SplObserver;同時(shí),主題中用SplObjectStorage來存儲(chǔ)觀察者列表。
這個(gè)是主題:
observers = new SplObjectStorage(); } /** * 注冊(cè)觀察者 * * Attach an SplObserver * @link https://php.net/manual/en/splsubject.attach.php * @param SplObserver $observer* The SplObserver to attach. *
* @return void * @since 5.1.0 */ public function attach(SplObserver $observer) { $this->observers->attach($observer); } /** * 注銷觀察者 * * Detach an observer * @link https://php.net/manual/en/splsubject.detach.php * @param SplObserver $observer* The SplObserver to detach. *
* @return void * @since 5.1.0 */ public function detach(SplObserver $observer) { $this->observers->detach($observer); } /** * 通知觀察者 * Notify an observer * @link https://php.net/manual/en/splsubject.notify.php * @return void * @since 5.1.0 */ public function notify() { // 循環(huán)調(diào)用觀察者自身的update方法 if ($this->observers->count() > 0) { /** @var SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } } /** * 數(shù)據(jù)改變,同時(shí)通知觀察者 * * @param $upd_data */ public function updData($upd_data) { $this->upd_data = $upd_data; // 當(dāng)數(shù)據(jù)改變時(shí),再需要通知觀察者的地方調(diào)用 notify $this->notify(); } /** * 消息改變,同時(shí)通知觀察者 * * @param $upd_msg */ public function updMsg($upd_msg) { $this->upd_msg = $upd_msg; // 這個(gè) notify 也可以不寫在方法中,靈活運(yùn)用 $this->notify(); } /** * @return mixed */ public function getUpdData() { return $this->upd_data; } /** * @return mixed */ public function getUpdMsg() { return $this->upd_msg; } }
有一個(gè)貓貓觀察者:
* The SplSubject notifying the observer of an update. * * @return void * @since 5.1.0 */ public function update(SplSubject $subject) { // 這個(gè) $subject 一開始比較難理解,最后發(fā)現(xiàn)確實(shí)很聰明 // 我覺得這種實(shí)現(xiàn)方式最好,具體要得到哪些更新,由注冊(cè)觀察者的主題決定 // 觀察者不知道主題的細(xì)節(jié),只知道實(shí)現(xiàn)了觀察者接口 /** * @var Subject $subject */ $listen_data = $subject->getUpdData(); $listen_msg = $subject->getUpdMsg(); echo "I am 貓貓觀察者,I get new data:" . $listen_data . ";msg:" . $listen_msg; echo "
"; } }
還有一個(gè)狗狗觀察者:
getUpdData(); $listem_msg = $subject->getUpdMsg(); echo "I am 狗狗觀察者,data:" . $listen_data . ";msg:" . $listem_msg; echo "
"; } }
來看一下調(diào)用吧:
attach($catObserver); $subject->attach($dogObserver); // 主題有所變化,觀察者得到對(duì)應(yīng)的變化 $subject->updData(12); $subject->updMsg("你媽媽喊你回家吃飯");
顯示結(jié)果:
I am 貓貓觀察者,I get new data:12;msg:還不該吃飯 I am 狗狗觀察者,data:12;msg:還不該吃飯 I am 貓貓觀察者,I get new data:12;msg:你媽媽喊你回家吃飯 I am 狗狗觀察者,data:12;msg:你媽媽喊你回家吃飯
把我的例子弄懂,你也應(yīng)該能理解觀察者模式了。
來看一下你學(xué)到了什么:
00原則--對(duì)象之間松耦合設(shè)計(jì)。
觀察者模式--在對(duì)象之間定義一對(duì)多的依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴他的對(duì)象就會(huì)收到通知,并自動(dòng)更新。
觀察者模式定義了對(duì)象之間的一對(duì)多關(guān)系。
觀察者不知道觀察者的細(xì)節(jié),也不知道主題的細(xì)節(jié),只知道實(shí)現(xiàn)了觀察者接口。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/29748.html
摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...
摘要:接下來會(huì)對(duì)其中五個(gè)比較常見的運(yùn)行模式進(jìn)行說明。模式是目前主流的服務(wù)運(yùn)行模式,擁有高效可靠的性能,推薦大家使用。由于微軟的排他性,只能運(yùn)行于環(huán)境。 SAPI 這里所說的 PHP 運(yùn)行模式, 其實(shí)指的是 SAPI (Server Application Programming Interface,服務(wù)端應(yīng)用編程端口 )。SAPI 為 PHP 提供了一個(gè)和外部通信的接口, PHP 就是通過這...
摘要:簡(jiǎn)單字符串緩存實(shí)戰(zhàn)完整實(shí)戰(zhàn)種設(shè)計(jì)模式設(shè)計(jì)模式是面向?qū)ο蟮淖罴褜?shí)踐成為專業(yè)程序員路上用到的各種優(yōu)秀資料神器及框架成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 微型新聞系統(tǒng)的開發(fā)(PHP 5.4 + MySQL 5.5) 微型新聞系統(tǒng)的開發(fā)(PHP 5.4 + MySQL 5.5) 九個(gè)很有用的 PHP 代碼 php 代碼 國內(nèi)值得關(guān)注的...
摘要:的機(jī)器學(xué)習(xí)庫的機(jī)器學(xué)習(xí)庫,包括算法交叉驗(yàn)證神經(jīng)網(wǎng)絡(luò)等內(nèi)容。在即將到來的大會(huì)上,她將和大家分享在機(jī)器學(xué)習(xí)領(lǐng)域的全新可能。入門總結(jié)入門相關(guān),如安裝配置基本使用等。 基于 Swoole 開發(fā) PHP 擴(kuò)展 Swoole-1.9.7 增加了一個(gè)新特性,可以基于 Swoole 使用 C++ 語言開發(fā)擴(kuò)展模塊,在擴(kuò)展模塊中可以注冊(cè) PHP 內(nèi)置函數(shù)和類。現(xiàn)在可以基于 Swoole 來編寫 PHP ...
摘要:當(dāng)客戶端請(qǐng)求到達(dá)時(shí),進(jìn)程管理器選擇并連接到一個(gè)解釋器。子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回。子進(jìn)程接著等待并處理來自進(jìn)程管理器運(yùn)行在中的下一個(gè)連接。 目前常見的4種PHP運(yùn)行模式 CGI通用網(wǎng)關(guān)接口模式 FAST-CGI模式 CLI命令行模式 模塊模式 運(yùn)行模式 CGI通用網(wǎng)關(guān)接口模式 每有一個(gè)用戶請(qǐng)求,都會(huì)先要?jiǎng)?chuàng)建cgi的子進(jìn)程,然后處理請(qǐng)求,處理完后結(jié)束這個(gè)子進(jìn)程...
摘要:話說當(dāng)下一共有種運(yùn)行模式,分別是和模塊模式。使用,全稱進(jìn)程管理器進(jìn)行管理。工作原理啟動(dòng)時(shí)載入進(jìn)程管理器進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)解釋器進(jìn)程并等待來自的連接當(dāng)客戶端請(qǐng)求到達(dá)時(shí),進(jìn)程管理器選擇并連接到一個(gè)解釋器。 我們知道 workerman 程序需要在php-cli模式下運(yùn)行,也就是命令行模式,這塊我們有必要了解一下。 話說PHP當(dāng)下一共有4種運(yùn)行模式,分別是CGI、FastCGI、...
閱讀 3225·2021-11-24 09:39
閱讀 3158·2021-10-21 09:38
閱讀 2396·2019-08-29 15:28
閱讀 3737·2019-08-26 12:23
閱讀 2615·2019-08-26 12:19
閱讀 1358·2019-08-23 12:44
閱讀 2125·2019-08-23 12:02
閱讀 993·2019-08-22 17:05