php設(shè)計(jì)模式 觀察者模式,設(shè)計(jì)模式觀察者_(dá)PHP教程
Jul 12, 2016 am 08:58 AMphp設(shè)計(jì)模式 觀察者模式,設(shè)計(jì)模式觀察者
觀察者模式的核心是把客戶元素(觀察者)從一個(gè)中心類(主體)中分離開(kāi)來(lái)。當(dāng)主體知道事件發(fā)生時(shí),觀察者需要被通知到。同時(shí),我們并不希望將主體與觀察者之間的關(guān)系進(jìn)行硬編碼。為了達(dá)到這個(gè)目的,我們可以允許觀察者在主體上進(jìn)行注冊(cè)。
觀察者模式實(shí)現(xiàn)了低耦合、非侵入式的通知與更新機(jī)制。
場(chǎng)景:當(dāng)一個(gè)事件發(fā)生后,要執(zhí)行一連串更新操作。
<span>EventGenerator</span>.php
<?<span>php namespace Baobab; </span><span>/*</span><span>* * Class EventGenerator 基類,事件發(fā)生者 </span><span>*/</span> <span>abstract</span> <span>class</span><span> EventGenerator{ </span><span>//</span><span>觀察者對(duì)于事件發(fā)生者是不可見(jiàn)的,事件發(fā)生者不關(guān)心有哪些觀察者關(guān)注了事件</span> <span>private</span> <span>$observers</span> = <span>array</span><span>(); </span><span>/*</span><span>* * 添加觀察者 </span><span>*/</span> <span>function</span> addObserver(Observer <span>$observer</span><span>){ </span><span>$this</span>->observers[] = <span>$observer</span><span>; } </span><span>/*</span><span>* *逐個(gè)通知觀察者進(jìn)行更新的操作 </span><span>*/</span> <span>function</span><span> notify(){ </span><span>foreach</span>(<span>$this</span>->observers <span>as</span> <span>$observer</span><span>){ </span><span>$observer</span>-><span>update(); } } }</span>
<span>Observer</span>.php
<?<span>php namespace Baobab; </span><span>/*</span><span>* * Class Observer 觀察者,觀察的對(duì)象是事件發(fā)生者 * @package Baobab </span><span>*/</span> <span>interface</span><span> Observer{ </span><span>/*</span><span>* * @param null $event_info 事件的信息 * 表示事件發(fā)生后進(jìn)行更新的操作 </span><span>*/</span> <span>function</span> update(<span>$event_info</span> = <span>null</span><span>); }</span>
index.php
<span>class</span> Event <span>extends</span><span> \Baobab\EventGenerator{ </span><span>/*</span><span>* *觸發(fā)一個(gè)新的事件 </span><span>*/</span> <span>function</span><span> trigger(){ </span><span>echo</span> 'Event發(fā)生'<span>; </span><span>$this</span>-><span>notify(); } } </span><span>/*</span><span>* * 觀察者1 </span><span>*/</span> <span>class</span> Observer1 <span>implements</span><span> \Baobab\Observer{ </span><span>function</span> Update(<span>$event_info</span> = <span>null</span><span>){ </span><span>echo</span> '更新操作代碼1'<span>; } }<br /> <span>/*<span>* <br /> * 觀察者2 <br /><span> */</span></span></span> </span><span>class</span> Observer2 <span>implements</span><span> \Baobab\Observer{ </span><span>function</span> Update(<span>$event_info</span> = <span>null</span><span>){ </span><span>echo</span> '更新操作代碼2'<span>; } } </span><span>$event</span> = <span>new</span><span> Event(); </span><span>$event</span>->addObserver(<span>new</span><span> Observer1()); </span><span>$event</span>->addObserver(<span>new</span><span> Observer2()); </span><span>$event</span>->trigger();
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

在Java框架中,設(shè)計(jì)模式和架構(gòu)模式的區(qū)別在於:設(shè)計(jì)模式定義了在軟體設(shè)計(jì)中解決常見(jiàn)問(wèn)題的抽象解決方案,專注於類別和物件之間的交互,例如工廠模式。架構(gòu)模式定義了系統(tǒng)結(jié)構(gòu)和模組之間的關(guān)係,關(guān)注系統(tǒng)元件的組織和交互,如分層架構(gòu)。

TDD用於編寫高品質(zhì)PHP程式碼,步驟包括:編寫測(cè)試案例,描述預(yù)期功能並使其失敗。編寫程式碼,僅使測(cè)試案例通過(guò),無(wú)需過(guò)度優(yōu)化或詳細(xì)設(shè)計(jì)。測(cè)試案例通過(guò)後,優(yōu)化和重構(gòu)程式碼以提高可讀性、可維護(hù)性和可擴(kuò)展性。

Guice框架應(yīng)用了多項(xiàng)設(shè)計(jì)模式,包括:?jiǎn)卫J剑和高^(guò)@Singleton註解確保類別只有一個(gè)實(shí)例。工廠方法模式:透過(guò)@Provides註解建立工廠方法,在依賴注入時(shí)取得物件實(shí)例。策略模式:將演算法封裝成不同策略類,透過(guò)@Named註解指定具體策略。

設(shè)計(jì)模式透過(guò)提供可重複使用和可擴(kuò)展的解決方案來(lái)解決程式碼維護(hù)難題:觀察者模式:允許物件訂閱事件,並在事件發(fā)生時(shí)收到通知。工廠模式:提供了一種創(chuàng)建物件的集中式方式,而無(wú)需依賴特定類別。單例模式:確保一個(gè)類別只有一個(gè)實(shí)例,用於建立全域可存取的物件。

裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許動(dòng)態(tài)添加物件功能,無(wú)需修改原始類別。它透過(guò)抽象組件、具體組件、抽象裝飾器和具體裝飾器的協(xié)作實(shí)現(xiàn),可以靈活擴(kuò)展類別功能,滿足變化的需求。範(fàn)例中,將牛奶和摩卡裝飾器添加到Espresso,總價(jià)為2.29美元,展示了裝飾器模式在動(dòng)態(tài)修改物件行為方面的強(qiáng)大功能。

適配器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許不相容物件協(xié)同工作,它將一個(gè)介面轉(zhuǎn)換為另一個(gè),使物件能夠順利互動(dòng)。物件適配器透過(guò)建立包含被適配器對(duì)象的適配器對(duì)象,並實(shí)現(xiàn)目標(biāo)接口,實(shí)現(xiàn)適配器模式。在一個(gè)實(shí)戰(zhàn)案例中,透過(guò)適配器模式,客戶端(如MediaPlayer)可以播放高級(jí)格式的媒體(如VLC),儘管本身僅支援普通媒體格式(如MP3)。

SpringMVC框架使用以下設(shè)計(jì)模式:1.單例模式:管理Spring容器;2.門面模式:協(xié)調(diào)控制器、視圖和模型互動(dòng);3.策略模式:根據(jù)請(qǐng)求選擇請(qǐng)求處理程序;4.觀察者模式:發(fā)布和監(jiān)聽(tīng)?wèi)?yīng)用程式事件。這些設(shè)計(jì)模式增強(qiáng)了SpringMVC的功能和靈活性,使開(kāi)發(fā)者可以創(chuàng)建高效、可維護(hù)的應(yīng)用程式。

Java框架中使用設(shè)計(jì)模式的優(yōu)點(diǎn)包括:程式碼可讀性、可維護(hù)性和可擴(kuò)充性增強(qiáng)。缺點(diǎn)包括:過(guò)度使用導(dǎo)致複雜性、效能開(kāi)銷以及學(xué)習(xí)曲線陡峭。實(shí)戰(zhàn)案例:代理模式用於延遲載入物件。明智地使用設(shè)計(jì)模式可充分利用其優(yōu)勢(shì)並最小化缺點(diǎn)。
