亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析PHP觀察者模式Observer

 更新時間:2021年05月26日 08:41:04   作者:phpyu  
Observer,首先要有一個被觀察的角色,但它是【唯一的】。雖然"表演者"只有一個但是"觀眾"有很多,既一群"人"圍觀一個"人"。既然有無數(shù)個觀察者,那么我們需要知道都有哪一些"人"。所以我們需要一個“容器”來記錄這些"人",一個類似于數(shù)組一樣來儲存所有觀察者的容器。

觀察者模式結(jié)構(gòu)圖

概念

一個"演員"(被觀察者),一群"觀眾"(觀察者),一臺"攝影機(jī)"(記錄容器)

【觀察者模式中主要角色】

1.抽象主題(Subject)角色:主題角色將所有對觀察者對象的引用保存在一個集合中,每個主題可以有任意多個觀察者。 抽象主題提供了增加和刪除觀察者對象的接口。

2.抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在觀察的主題發(fā)生改變時更新自己。

3.具體主題(ConcreteSubject)角色:存儲相關(guān)狀態(tài)到具體觀察者對象,當(dāng)具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色通常用一個具體子類實(shí)現(xiàn)。

4.具體觀察者(ConcretedObserver)角色:存儲一個具體主題對象,存儲相關(guān)狀態(tài),實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以使得其自身狀態(tài)和主題的狀態(tài)保持一致。

【使用場景】

假設(shè)項(xiàng)目經(jīng)理讓我們寫了一個登陸接口,咔咔擦擦寫完了

第二天讓我們加入統(tǒng)計(jì)登陸次數(shù),然后在后面加代碼第三天讓我們判斷登陸地區(qū),又在后面加代碼第四天讓我們在用戶登陸后推送活動,再再后面加代碼第N天,這個接口已經(jīng)雜亂到?jīng)]人想維護(hù)了

我們需要讓項(xiàng)目保持高內(nèi)聚低耦合,就可以用到觀察者模式(非必須,看需求)

【觀察者模式與其它模式】

1.【中介者模式】(Mediator):通過封裝復(fù)雜的更新語義,ChangeManager充當(dāng)目標(biāo)和觀察者之間的中介者。
2.【單例模式】(singleton模式):ChangeManager可使用Singleton模式來保證它是唯一的并且是可全局訪問的。

代碼示例

接口示例

// 主題接口
interface Subject{
    public function register(Observer $observer);
    public function notify();
}
// 觀察者接口
interface Observer{
    public function watch();
}

Subject就是被觀察者,Observer就是觀眾,也就是觀察者

被觀察者

// 被觀察者
class Action implements Subject{
     public $_observers=array();
     public function register(Observer $observer){
         $this->_observers[]=$observer;
     }
 
     public function notify(){
         foreach ($this->_observers as $observer) {
             $observer->watch();
         }
 
     }
 }

Action實(shí)現(xiàn)了被觀察者接口,他現(xiàn)在就是被觀察者,再定義一個$_observers數(shù)組,他就是記錄觀眾的容器了。

首先實(shí)現(xiàn)register方法,用它傳入一個觀察者,然后塞到數(shù)組里,再實(shí)現(xiàn)notify()方法,它會遍歷容器數(shù)組,執(zhí)行每個觀察者的watch()方法。

觀察者

// 觀察者
class Cat implements Observer{
     public function watch(){
         echo "Cat watches TV<hr/>";
     }
 }
 class Dog implements Observer{
     public function watch(){
         echo "Dog watches TV<hr/>";
     }
 }
 class People implements Observer{
     public function watch(){
         echo "People watches TV<hr/>";
     }
 }

這里定義了三個觀察者,全都實(shí)現(xiàn)了Observer接口,前面的Subject會循環(huán)調(diào)用每個觀察者的watch()方法,所以我們需要實(shí)現(xiàn)每個觀察者的watch()方法。

調(diào)用

// 應(yīng)用實(shí)例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

首先new被觀察者對象,執(zhí)行它的register()方法,把每個觀察者都放入容器數(shù)組,最后執(zhí)行notify()方法,通知所有觀察者執(zhí)行自己的方法。

PHP原生自帶的觀察者模式

PHP有自帶的觀察者模式

  • splsubject接口 - 被觀察者
  • Observer接口 - 觀察者
  • SplObjectStorage對象 - 容器

首先我們有一個用戶登錄類

class user{

  public function login()
  {
      echo '登錄完畢'
  }

讓他實(shí)現(xiàn)splsubject接口成為被觀察者。

  • 首先在構(gòu)造函數(shù)里,讓他new SplObjectStorag()對象并賦值到屬性上方便后面調(diào)用
  • 實(shí)現(xiàn)attach()方法,用來注冊觀察者
  • 實(shí)現(xiàn)detach()方法,用來刪除觀察者
  • 實(shí)現(xiàn)notify()方法,用來遍歷容器,調(diào)用每個觀察者的update方法(必須是update)
  • rewind方法是容器指針重置到最開始,valid方法檢測容器是否遍歷完成并返回布爾,current方法是獲取當(dāng)前的觀察者,next方法是將指針后移一位
  • 修改login()方法,在里面調(diào)用notify()來通知觀察者事件完成了
class user implements splsubject{

    protected $observer = null;

    public function __construct()
    {
        $this->observer = new SplObjectStorage();
    }

    public function login()
    {
        $this->notify();
        echo '登錄完畢';
    }

    public function attach(SplObserver $observer)
    {
        $this->observer->attach($observer);
    }

    public function detach(SplObserver $observer)
    {
        $this->observer->detach($observer);
    }

    public function notify()
    {
        $this->observer->rewind();
        while ($this->observer->valid())
        {
            $observer = $this->observer->current();
            $observer->update($this);
            $this->observer->next();
        }
    }
}

觀察者

每個觀察者實(shí)現(xiàn)SplObserver接口,并實(shí)現(xiàn)update()方法

class cat implements SplObserver {

    public function update(SplSubject $subject)
    {
        echo '小貓叫一下';
    }
}
class dog implements SplObserver {
    public function update(SplSubject $subject)
    {
        echo '小狗吼一聲';
    }
}

應(yīng)用

// 實(shí)時觀察
$user = new user();
$user->attach(new cat());
$user->attach(new dog());
$user->login();

以上就是解析PHP觀察者模式(Observer)的詳細(xì)內(nèi)容,更多關(guān)于PHP觀察者模式(Observer)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PHP類型約束用法示例

    PHP類型約束用法示例

    這篇文章主要介紹了PHP類型約束用法,結(jié)合實(shí)例形式分析了php針對特定場合及特定類型進(jìn)行強(qiáng)制類型約束的操作方法,需要的朋友可以參考下
    2016-09-09
  • PHP實(shí)現(xiàn)瀏覽器格式化顯示XML的方法示例

    PHP實(shí)現(xiàn)瀏覽器格式化顯示XML的方法示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)瀏覽器格式化顯示XML的方法,涉及php針對xml節(jié)點(diǎn)的創(chuàng)建、添加、格式化顯示等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-01-01
  • PHP unset函數(shù)原理及使用方法解析

    PHP unset函數(shù)原理及使用方法解析

    這篇文章主要介紹了PHP unset函數(shù)原理及使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • php實(shí)現(xiàn)xml與json之間的相互轉(zhuǎn)換功能實(shí)例

    php實(shí)現(xiàn)xml與json之間的相互轉(zhuǎn)換功能實(shí)例

    這篇文章主要介紹了php實(shí)現(xiàn)xml與json之間的相互轉(zhuǎn)換功能,結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)xml轉(zhuǎn)json及json轉(zhuǎn)xml的相關(guān)原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價值
    2016-07-07
  • php中生成隨機(jī)密碼的自定義函數(shù)代碼

    php中生成隨機(jī)密碼的自定義函數(shù)代碼

    這篇文章主要分享下php中生成隨機(jī)密碼的方法,原理就是把一些要生成的字符預(yù)置一個的字符串包括數(shù)字拼音之類的以及一些特殊字符,這樣我們再隨機(jī)取字符組成我們想要的隨機(jī)密碼了
    2013-10-10
  • 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式

    學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式

    這篇文章主要介紹了php設(shè)計(jì)模式中的狀態(tài)模式,使用php實(shí)現(xiàn)狀態(tài)模式,感興趣的小伙伴們可以參考一下
    2015-12-12
  • php 表單提交大量數(shù)據(jù)發(fā)生丟失的解決方法

    php 表單提交大量數(shù)據(jù)發(fā)生丟失的解決方法

    這篇文章主要介紹了php表單提交大量數(shù)據(jù)、上千個文本框時發(fā)生數(shù)據(jù)丟失、數(shù)據(jù)不完整等問題的解決方法,需要的朋友可以參考下
    2014-03-03
  • PHP獲取photoshop寫入圖片文字信息的方法

    PHP獲取photoshop寫入圖片文字信息的方法

    這篇文章主要介紹了PHP獲取photoshop寫入圖片文字信息的方法,涉及php操作圖片的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • PHP htmlspecialchars_decode()函數(shù)用法講解

    PHP htmlspecialchars_decode()函數(shù)用法講解

    今天小編就為大家分享一篇關(guān)于PHP htmlspecialchars_decode()函數(shù)用法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • PHP訪問Google Search API的方法

    PHP訪問Google Search API的方法

    這篇文章主要介紹了PHP訪問Google Search API的方法,實(shí)例分析了php針對谷歌API訪問的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03

最新評論