摘要:最近在學(xué)的設(shè)計(jì)模式,看到了觀察者模式,在此寫下一點(diǎn)理解問(wèn)題假如一個(gè)小販,他把產(chǎn)品的價(jià)格提升了,不同的消費(fèi)者會(huì)對(duì)此產(chǎn)生不同的反應(yīng)。
最近在學(xué)php 的設(shè)計(jì)模式, 看到了觀察者模式,在此寫下一點(diǎn)理解:
問(wèn)題:
假如一個(gè)小販, 他把產(chǎn)品的價(jià)格提升了, 不同的消費(fèi)者會(huì)對(duì)此產(chǎn)生不同的反應(yīng)。一般的編程模式無(wú)非是獲取提升的價(jià)格,然后獲取所有的消費(fèi)者,再循環(huán)每個(gè)消費(fèi)者, 不同的消費(fèi)者根據(jù)價(jià)格漲幅做出決定,如果消費(fèi)者的類型有限,因而進(jìn)行的判斷也不多,這種無(wú)可厚非,但如果有更多的類型的消費(fèi)者加入進(jìn)來(lái), 那這個(gè)代碼就變得臃腫且難以維護(hù), 因?yàn)橐煌5耐锩婕尤肱袛啻a,這個(gè)時(shí)候其實(shí)就適用觀察者模式了
思路:
觀察者模式分為兩個(gè)角色, 觀察者(observer)和被觀察者(observables), 先在被觀察者注冊(cè)一系列的被觀察者, 在被觀察者發(fā)生變化的時(shí)候,通知觀察者,進(jìn)而觀察者自動(dòng)進(jìn)行更新,這種一對(duì)多的關(guān)系就像你是一個(gè)小販(被觀察者),賣東西,有很多人(觀察者)在買你的東西,假如你要升價(jià), 這個(gè)時(shí)候所有的消費(fèi)者(觀察者)可以決定繼續(xù)買,還是不買,還是其他動(dòng)作,作為小販(被觀察者)的你只需要把價(jià)格增加,繼而通知一下,而不用去管其他人(觀察者)的動(dòng)作。
實(shí)現(xiàn):
//先定義一個(gè)被觀察者的接口,這個(gè)接口要實(shí)現(xiàn)注冊(cè)觀察者,刪除觀察者和通知的功能。 interface Observables { public function attach(observer $ob); public function detach(observer $ob); public function notify(); } class Saler implements Observables { protected $obs = array(); //把觀察者保存在這里 protected $range = 0; public function attach(Observer $ob) { $this->obs[] = $ob; } public function detach(Observer $ob) { foreach($this->obs as $o) { if($o != $ob) $this->obs[] = $o; } } public function notify() { foreach($this->obs as $o) { $o->doActor($this); } } public function increPrice($range) { $this->range = $range; } public function getAddRange() { return $this->range; } } //定義一個(gè)觀察者的接口,這個(gè)接口要有一個(gè)在被通知的時(shí)候都要實(shí)現(xiàn)的方法 interface Observer { public function doActor(Observables $obv); } //為了容易閱讀,我在這里增加了一層,定義了一個(gè)買家, 之后會(huì)有Poor和Rich兩種不同的類型繼承這個(gè)類,用以表示不同類型的買家 abstract class Buyer implements Observer { } class PoorBuyer extends Buyer { //PoorBurer的做法 public function doActor(observables $obv) { if($obv->getAddRange() > 10) echo "不買了.
"; else echo "還行,買一點(diǎn)吧.
"; } } class RichBuyer extends Buyer { //RichBuyer的做法 public function doActor(observables $obv) { echo "你再漲我也不怕,咱不差錢.
"; } } $saler = new Saler(); //小販(被觀察者) $saler->attach(new PoorBuyer()); //注冊(cè)一個(gè)低收入的消費(fèi)者(觀察者) $saler->attach(new RichBuyer()); //注冊(cè)一個(gè)高收入的消費(fèi)者(觀察者) $saler->notify(); //通知 $saler->increPrice(2); //漲價(jià) $saler->notify(); //通知
如果再有新的類型買家,只要再添加一個(gè)買家類型,繼承buyer,讓買家(被觀察者)注冊(cè)即可,而不用再去修改任何原來(lái)買家和賣家的任何內(nèi)容
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/20860.html
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:前言年底了不太忙,最近一段時(shí)間也一直在研究,就想寫篇關(guān)于比較深一點(diǎn)的教程系列啥的,于是就找到站長(zhǎng)給開了寫教程的渠道。優(yōu)點(diǎn)的就是為藝術(shù)家創(chuàng)造的框架,它也是工程化的趨勢(shì)。項(xiàng)目維護(hù)方便也是事實(shí)。如果有遇到問(wèn)題可以直接在教程下面留言。 前言 年底了不太忙,最近一段時(shí)間也一直在研究laravel,就想寫篇關(guān)于laravel比較深一點(diǎn)的教程系列啥的,于是就找到站長(zhǎng)給開了寫教程的渠道。由于第一次寫,...
摘要:我們可以做一些小改進(jìn)將的拋出異常代碼挪入父類屬于最小單位。完整代碼當(dāng)我們需要在某個(gè)子類,實(shí)現(xiàn)個(gè)性化的業(yè)務(wù)邏輯時(shí),組合模式的缺陷之一正在顯現(xiàn)出來(lái)簡(jiǎn)化的前提是所有的類都繼承同一個(gè)基類,簡(jiǎn)化優(yōu)點(diǎn)有時(shí)是以降低對(duì)象安全為代價(jià)。 開篇 如果你注意了目錄,會(huì)知道:組合是一個(gè)新的開始。在系統(tǒng)代碼設(shè)計(jì)的過(guò)程中,我們通過(guò)繼承來(lái)組織代碼,父類與子類,實(shí)質(zhì)上對(duì)應(yīng)了業(yè)務(wù)的整體規(guī)范與具體需求。所以,我們需要將類按...
摘要:最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。不過(guò)因?yàn)椴恢С侄嗑€程所以不需要考慮這個(gè)問(wèn)題了。 最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。 一、設(shè)計(jì)模式簡(jiǎn)介 首先我們來(lái)認(rèn)識(shí)一下什么是設(shè)計(jì)模式: 設(shè)計(jì)模式是一套被反復(fù)使用、容易被他人理解的、可靠的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。 設(shè)計(jì)模式不...
閱讀 3319·2021-11-08 13:12
閱讀 2756·2021-10-15 09:41
閱讀 1451·2021-10-08 10:05
閱讀 3300·2021-10-08 10:04
閱讀 2102·2021-09-29 09:34
閱讀 2472·2019-08-30 15:55
閱讀 2979·2019-08-30 15:45
閱讀 2577·2019-08-29 14:17