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