溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP設(shè)計(jì)模式-觀察者

發(fā)布時(shí)間:2020-06-28 17:37:24 來源:網(wǎng)絡(luò) 閱讀:389 作者:侯施群 欄目:web開發(fā)

PHP設(shè)計(jì)模式-觀察者

   

   一個(gè)對(duì)象狀態(tài)發(fā)生改變后,會(huì)影響到其他幾個(gè)對(duì)象的改變,這時(shí)候可以用觀察者模式。一個(gè)對(duì)象通過添加一個(gè)attach方法允許觀察者注冊(cè)自己,使本身變得可觀察。當(dāng)被觀察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。觀察者使用該信息執(zhí)行的操作與被觀察的對(duì)象無關(guān)。觀察者模式是一種事件系統(tǒng),意味著這一模式允許某些類通過觀察被觀察類的狀態(tài)變化,做出相應(yīng)的動(dòng)作。

   

  觀察者模式UML圖

PHP設(shè)計(jì)模式-觀察者

  php5中提供了觀察者observer與被觀察者subject接口

   interface SplSubject  

    {  

    function attach(SplObserver $observer);  

    function detach(SplObserver $observer);  

    function notify();  

    }  

   interface SqlObserver  

    {  

    function update(SplSubject $subject);  

    }

  例子如下

<?php
  class user implements SplSubject{
  public     $lognum;
  public     $hobby;
  protected  $observers;
  
  public function __construct($hobby){
      $this->lognum= rand(1,10);
      $this->hobby= $hobby;
      $this->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);
  }
  
  public function notify(){
      $this->observers->rewind();
      while($this->observers->valid){
         $observer= $this->observers->current();
         $observer->update($this);
         $this->observers->next();
      }      
  }    
  }
   
  class secrity implements SPLObserver{
      
      public function update(SplSubject $subject){
          if($subject->lognum>=3){
              
          }else{
              
          }          
      }
  }
    
  class ad implements SPLObserver{
  
      public function update(SplSubject $subject){
          if($subject->hobby=="sports"){
  
          }else{
  
          }  
      }
  }
  
  //實(shí)施觀察
  $user= new user("sports");
  $user->attach(new secrity());
  $user->attach(new ad());
  $user->login();
  
  ?>


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI