亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

編程中的那些套路——關(guān)于觀察者模式

Fourierr / 1808人閱讀

摘要:我們應(yīng)該寫一段拓展性強(qiáng)與維護(hù)性較強(qiáng)的代碼,由此衍生出觀察者模式。

該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP

今天我們來談?wù)動(dòng)^察者模式,這是一個(gè)經(jīng)常用到的設(shè)計(jì)模式。

讓我們想象一個(gè)場景:一個(gè)網(wǎng)站有不同等級(jí)區(qū)域的用戶,不同等級(jí)的的用戶登錄后可以獲得對(duì)應(yīng)的服務(wù)(一級(jí)用戶登錄后獲得一級(jí)服務(wù),二級(jí)用戶登錄后獲得二級(jí)服務(wù),…以此類推)。那么我們?nèi)绾螌戇@段業(yè)務(wù)邏輯呢?

按照一般思路:我們會(huì)寫N個(gè)if..else判斷,像下面這樣:

//登錄操作..省略
 
if(一級(jí)用戶) {
 
echo " 一級(jí)服務(wù)";
 
} else if(二級(jí)用戶){
 
echo "二級(jí)服務(wù)";
 
} else if(三級(jí)用戶){
 
echo "三級(jí)服務(wù)";
 
}
 

但這樣寫代碼有一個(gè)弊端,如果我們又增加了一個(gè)等級(jí)用戶,那么我們是不是要修改原來的代碼呢(增加多一個(gè)if..else判斷),這樣做是非常不妥當(dāng)?shù)?,因?yàn)閷懞玫拇a我們不應(yīng)該碰它。

我們應(yīng)該寫一段拓展性強(qiáng)與維護(hù)性較強(qiáng)的代碼,由此衍生出觀察者模式。

觀察者模式的大致思路是這樣的:有一個(gè)觀察者列表(A),有一個(gè)被觀察者列表(B),當(dāng)B發(fā)生變化時(shí),程序就會(huì)遍歷觀察者列表A,隨之執(zhí)行對(duì)應(yīng)的update操作,然后獲得想要的效果。語言表述可能比較難以理解,我們來看代碼吧。

PHP已經(jīng)幫我們內(nèi)置了一個(gè)觀察者模式的接口(The SplSubject interface),我們可以直接實(shí)現(xiàn)這個(gè)接口:


并且php還提供了一個(gè)存儲(chǔ)對(duì)象的class(即觀察者列表):

當(dāng)然我們完全可以不使用這個(gè)類,可以用數(shù)組代替。

具體代碼:

觀察者模式.php

observers = new SplObjectStorage();
 
    }
 
    //登錄
 
    public function login(){
 
        //登錄過程,省略
 
        $this->notify();
 
    }
 
    //添加觀察者
 
    public function attach(SplObserver $observer){
 
        $this->observers->attach($observer);
 
    }
 
    //剔除觀察者
 
    public function detach(SplObserver $observer){
 
        $this->observers->detach($observer);
 
    }
 
    //登陸后通知notify
 
    public function notify(){
 
        $observers = $this->observers;
 
        //這段rewind不可或缺... 將節(jié)點(diǎn)指針指向第一位節(jié)點(diǎn)
 
        $observers->rewind();
 
        //當(dāng)前節(jié)點(diǎn)存在
 
            while($observers->valid()){
 
                $observer = $observers->current();//獲取當(dāng)前節(jié)點(diǎn)(即觀察者)
 
                $observer->update($this);//進(jìn)行update犯法操作
 
                $observers->next();//next 節(jié)點(diǎn)
 
            }
 
    }
 
}
 
//observer User1Observers
 
class User1Observers implements SplObserver {
 
    public function update(SplSubject $subject){
 
        echo "我是一級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的一級(jí)服務(wù)";
 
    }
 
}
 
//observer User2Observers
 
class User2Observers implements SplObserver {
 
    public function update(SplSubject $subject){
 
        echo "我是二級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的二級(jí)服務(wù)";
 
    }
 
}
 
//observer CommenUserObservers
 
class CommenUserObservers implements SplObserver {
 
    public function update(SplSubject $subject){
 
        echo "我是普通用戶,請(qǐng)給我對(duì)應(yīng)的普通服務(wù)";
 
    }
 
}
 
//如果需要的話可以繼續(xù)增加或者減少用戶等級(jí),絲毫不會(huì)影響原本的等級(jí)用戶
 

 
$subject = new LoginSubject();
 
$CommenUserObservers = new CommenUserObservers;//普通用戶
 
$subject->attach(new User1Observers);//增加觀察者:一級(jí)用戶
 
$subject->attach(new User2Observers);//增加觀察者:二級(jí)用戶
 
$subject->attach($CommenUserObservers);//增加觀察者:普通用戶
 
$subject->login();//登錄,觸發(fā)notify
 
//output:我是一級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的一級(jí)服務(wù)我是二級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的二級(jí)服務(wù)我是普通用戶,請(qǐng)給我對(duì)應(yīng)的普通服務(wù)
 
echo "
"; //如果有一天普通用戶壓根沒有對(duì)應(yīng)的服務(wù)了,那么我們就可以剔除它了 //$subject->detach(new CommenUserObservers); 無效 $subject->detach($CommenUserObservers);//刪除觀察者:普通用戶 $subject->login();//登錄,觸發(fā)notify,普通用戶就不會(huì)被通知啦 //output:我是一級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的一級(jí)服務(wù)我是二級(jí)用戶,請(qǐng)給我對(duì)應(yīng)的二級(jí)服務(wù) ?>

看出門道了嗎?每當(dāng)?shù)卿洸僮鞯臅r(shí)候,就會(huì)順帶觸發(fā)notify方法,從而遍歷關(guān)注者列表內(nèi)的對(duì)象方法update,從而達(dá)到不同的用戶獲得不同的服務(wù)目的,而當(dāng)我們需要新增/減少用戶等級(jí)的時(shí)候又不需要修改源代碼,很好的符合了開放封閉原則。

我一直認(rèn)為觀察者模式單例模式、工廠模式三者都是很棒的設(shè)計(jì)模式,但觀察者模式理解起來稍微比較困難,如果有困惑的話可以直接在評(píng)論區(qū)發(fā)問。

該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/21671.html

相關(guān)文章

  • 編程中的那些套路——關(guān)于責(zé)任鏈模式

    該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP 今天來談?wù)勜?zé)任鏈模式,乍一聽責(zé)任鏈模式好像很高級(jí)的一樣,但是相信我,其實(shí)每位天朝的同學(xué)都十分熟悉這個(gè)模式,責(zé)任鏈模式,就好像中國的官場制度一樣,每一個(gè)級(jí)別的權(quán)利都區(qū)分的很細(xì),舉個(gè)生活中的栗子: 村委不能越級(jí)去替鎮(zhèn)委辦事情,如果村委無法解決,只能向上求助鎮(zhèn)委 鎮(zhèn)委不能越級(jí)去替市委辦事情,如果鎮(zhèn)委無法解決,只能向上求...

    lylwyy2016 評(píng)論0 收藏0
  • 編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總

    摘要:如果看不懂的話,可以在評(píng)論區(qū)中提問,我會(huì)第一時(shí)間回答你無論何時(shí)我一直都在嗯哼該文章屬于編程中的那些經(jīng)典套路設(shè)計(jì)模式匯總系列 在正式閱讀前,我先談?wù)勎覀冊(cè)撚檬裁醋藙?shì)和心態(tài)學(xué)習(xí)設(shè)計(jì)模式: 如果你還沒有過多的編程經(jīng)驗(yàn)(泛指半年以下),我建議你把它當(dāng)做小說來看,能看懂多少是多少,因?yàn)榘肽暌韵陆?jīng)驗(yàn)的程序員用到設(shè)計(jì)模式的情況只會(huì)出現(xiàn)在面試上,至于實(shí)際工作中?相對(duì)來說這部分不會(huì)由你負(fù)責(zé)。 如果你已...

    youkede 評(píng)論0 收藏0
  • 編程中的那些套路——關(guān)于工廠模式

    摘要:該文章屬于編程中的那些經(jīng)典套路設(shè)計(jì)模式匯總系列,并且以下內(nèi)容基于語言前面我們寫了簡單工廠模式,編程中的那些套路關(guān)于簡單工廠模式,但簡單工廠模式有一些不足違反開放封閉原則,所以需要設(shè)計(jì)出一套更加規(guī)范的設(shè)計(jì)模式。 該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP 前面我們寫了簡單工廠模式,《編程中的那些套路——關(guān)于簡單工廠模式》,但簡單工廠模式有一些不足(...

    light 評(píng)論0 收藏0
  • 編程中的那些套路——關(guān)于簡單工廠模式

    摘要:簡單工廠模式就是遵循了這一原則,它讓不同職責(zé)的類各司其職。重點(diǎn)來了,簡單工廠模式的不足但是簡單工廠模式有一個(gè)不足,雖然它遵循了單一職責(zé)原則,但它違反了另一條同樣很重要的原則開放封閉原則。 該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP 面向?qū)ο笪宕笤瓌t中有一點(diǎn)非常重要的原則:單一職責(zé)原則。 簡單工廠模式就是遵循了這一原則,它讓不同職責(zé)的類各司其職。 ...

    Rocture 評(píng)論0 收藏0
  • 編程中的那些套路——關(guān)于單例模式

    該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP 在設(shè)計(jì)模式中,單例模式和工廠模式)可以說是使用的最普遍的設(shè)計(jì)模式了,所以掌握此種模式尤為重要。 單例模式一般使用在資源共享和需要控制資源的情況下。 例如:購物車,回收站,數(shù)據(jù)庫連接池,計(jì)數(shù)器,配置文件共享等所有項(xiàng)目中只需要存在一個(gè)的模塊,你都可以采用單例模式。 單例模式的好處就在于當(dāng)前進(jìn)程只產(chǎn)生一個(gè)對(duì)象(或者叫...

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

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

0條評(píng)論

Fourierr

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<