国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php面向?qū)ο笤O(shè)計(jì)模式 之 觀察者模式

genedna / 377人閱讀

摘要:最近在學(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

相關(guān)文章

  • php設(shè)計(jì)模式

    摘要:我們今天也來(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é)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(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é)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • Laravel 深入核心系列教程

    摘要:前言年底了不太忙,最近一段時(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)給開了寫教程的渠道。由于第一次寫,...

    wemall 評(píng)論0 收藏0
  • 面向對(duì)象PHP模式:組合

    摘要:我們可以做一些小改進(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ī)范與具體需求。所以,我們需要將類按...

    546669204 評(píng)論0 收藏0
  • 優(yōu)才公開課筆記:php設(shè)計(jì)模式(一) 單例模式

    摘要:最近開展了三次設(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ì)模式不...

    guyan0319 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<