摘要:模式定義觀察者模式定義對(duì)象間的一種一對(duì)多或一對(duì)一的依賴(lài)關(guān)系,當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí),注冊(cè)的觀察者都會(huì)被通知。需要在系統(tǒng)中創(chuàng)建一個(gè)觸發(fā)鏈,對(duì)象的行為將影響對(duì)象,對(duì)象的行為將影響對(duì)象,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制。
模式定義
觀察者模式(observer pattern): 定義對(duì)象間的一種一對(duì)多(或一對(duì)一)的依賴(lài)關(guān)系,當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí),注冊(cè)的觀察者都會(huì)被通知。
觀察者模式又稱(chēng) 發(fā)布-訂閱(publish/subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽(tīng)器(Source/Listener)模式或從屬者(Dependents)模式
建立一種對(duì)象和對(duì)象之間的依賴(lài)關(guān)系,一個(gè)對(duì)象發(fā)生改變時(shí)將自動(dòng)通知其他對(duì)象,其他對(duì)象收到通知各自處理自己的業(yè)務(wù)邏輯。這里發(fā)生改變的對(duì)象稱(chēng)為被觀察者,被通知的對(duì)象稱(chēng)為觀察者。這些觀察者之間沒(méi)有關(guān)系,可以根據(jù)業(yè)務(wù)需求添加或刪除觀察者,便于系統(tǒng)維護(hù)和擴(kuò)展。
模式結(jié)構(gòu)Subject(目標(biāo))
ConcreteSubject(具體目標(biāo))
Observer: 觀察者
ConcreteObserver:具體觀察者
UML 圖
代碼實(shí)現(xiàn)的場(chǎng)景: 假設(shè)有個(gè)一個(gè)商人賣(mài)東西,他的用戶(hù)有窮人和富人兩類(lèi),商人的商品可能會(huì)漲價(jià)也可能會(huì)降價(jià) 價(jià)格波動(dòng)對(duì)窮人和富人的購(gòu)買(mǎi)行為有不同的影響。
分析: 這里的觀者目標(biāo)是 商品價(jià)格 ,被觀察者是窮人和富人,商品價(jià)格變化將會(huì)通知窮人和富人,窮人富人對(duì)購(gòu)買(mǎi)做出不同的反映。
// 目標(biāo) interface Observables { public function attach(Observer $ob); public function detach(Observer $ob); public function notify(); } // 具體目標(biāo) class Saler implements Observables { protected $obs = []; protected $range = 0; public function attach(Observer $ob) { $this->obs[] = $ob; } public function detach(Observer $ob) { foreach ($this->obs as $k=>$v){ if($v != $ob){ $this->obs[] = $v; } } } public function notify() { // $this->range 為0表示價(jià)格不變 大于0漲價(jià) 小于0降價(jià) if($this->range != 0){ foreach ($this->obs as $ob) { $ob->update($this); } } } public function increPrice($range) { $this->range = $range; } public function getRange() { return $this->range; } } // 觀察者 interface Observer { public function update(Observables $obv); } //具體觀察者(窮人) class PoorBuyer implements Observer{ public function update(Observables $obv) { if($obv->getRange()>0){ echo "窮人:漲價(jià)不買(mǎi)了"; }else{ echo "窮人:降價(jià)了趕緊買(mǎi)"; } } } //具體觀察者(富人) class RichBuyer implements Observer{ public function update(Observables $obv) { echo "富人:價(jià)格波動(dòng)沒(méi)關(guān)系,繼續(xù)購(gòu)買(mǎi)模式應(yīng)用場(chǎng)景
"; } }
一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴(lài)于另一個(gè)方面。將這些方面封裝在獨(dú)立的對(duì)象中使它們可以各自獨(dú)立地改變和復(fù)用
一個(gè)對(duì)象的改變將導(dǎo)致其他一個(gè)或多個(gè)對(duì)象也發(fā)生改變,而不知道具體有多少對(duì)象將發(fā)生改變,可以降低對(duì)象之間的耦合度。
一個(gè)對(duì)象必須通知其他對(duì)象,而并不知道這些對(duì)象是誰(shuí)。
需要在系統(tǒng)中創(chuàng)建一個(gè)觸發(fā)鏈,A對(duì)象的行為將影響B(tài)對(duì)象,B對(duì)象的行為將影響C對(duì)象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26309.html
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們應(yīng)該寫(xiě)一段拓展性強(qiáng)與維護(hù)性較強(qiáng)的代碼,由此衍生出觀察者模式。 該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語(yǔ)言PHP 今天我們來(lái)談?wù)動(dòng)^察者模式,這是一個(gè)經(jīng)常用到的設(shè)計(jì)模式。 讓我們想象一個(gè)場(chǎng)景:一個(gè)網(wǎng)站有不同等級(jí)區(qū)域的用戶(hù),不同等級(jí)的的用戶(hù)登錄后可以獲得對(duì)應(yīng)的服務(wù)(一級(jí)用戶(hù)登錄后獲得一級(jí)服務(wù),二級(jí)用戶(hù)登錄后獲得二級(jí)服務(wù),…以此類(lèi)推)。那么我們?nèi)绾螌?xiě)這段業(yè)...
摘要:就像一群人完成某一項(xiàng)工作,不能一窩蜂全上,需要有組織有紀(jì)律,這個(gè)組織和紀(jì)律就是設(shè)計(jì)模式的概念。行為型設(shè)計(jì)模式用于在不同的對(duì)象之間管理算法關(guān)系以及職責(zé)結(jié)構(gòu)型設(shè)計(jì)模式用于在不同的對(duì)象之間構(gòu)造大的對(duì)象結(jié)構(gòu)。 前言:php設(shè)計(jì)模式這個(gè)系列是基于我2012年的學(xué)習(xí)筆記,共11篇,結(jié)合近幾年一些開(kāi)發(fā)實(shí)踐,也參考網(wǎng)上的一些高手的文章和視頻,編輯整理而成,希望能給大家的幫助帶來(lái)一些幫助。php設(shè)計(jì)模式...
摘要:創(chuàng)建型模式主要有以下五種簡(jiǎn)單工廠模式和工廠方法模式抽象工廠模式單例模式建造者模式原型模式在設(shè)計(jì)模式一書(shū)中將工廠模式分為兩類(lèi)工廠方法模式與抽象工廠模式。 一、 設(shè)計(jì)模式(Design pattern)是什么 設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過(guò)分類(lèi)編目的代碼設(shè)計(jì)的經(jīng)驗(yàn)總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 二、 為什么會(huì)有設(shè)計(jì)模式 在軟件開(kāi)發(fā)過(guò)...
閱讀 2155·2021-11-12 10:36
閱讀 2147·2021-09-03 10:41
閱讀 2761·2021-08-19 10:57
閱讀 1230·2021-08-17 10:14
閱讀 1487·2019-08-30 15:53
閱讀 1210·2019-08-30 15:43
閱讀 975·2019-08-30 13:16
閱讀 2983·2019-08-29 16:56