SplObserverオブザーバモード

2261 ワード

実は観察者モードこれは比較的理解しやすいモードであるでしょう.それはイベントシステムであり、あるクラスが別のクラスの状態を観察することを可能にし、観察されたクラスの状態が変化したとき、観察クラスは通知を受け、相応の動作を行うことができることを意味します.例えばキーボード、私が叩くと、システムは通知を受け取り、対応する応答を行います.
PHPにとって、PHP内蔵は、外部アプリケーション領域がこのモードを実現するために2つのインタフェースを提供する.
SplSubjectインタフェースは、観察されたオブジェクトを表し、その構造は次のとおりです.
interface SplSubject{

public function attach(SplObserver $observer);

public function detach(SplObserver $observer);

public function notify();
}

SplObserverインタフェースは、観察者として機能するオブジェクトを表し、その構造は次のとおりです.
interface SplObserver{

  public function update(SplSubject $subject);
}

このモードはこのように実現される.SplSubjectは特定の状態を維持し、この状態が変化するとnotify()で前にattachでSplSubjectに登録されたすべてのSplObserverに通知し、対応するupdateメソッドを呼び出す.
簡単な例:
class subject implements SplSubject{

              private $observers , $value;

              public function __construct(){

                     $this->observers = array();   

              }

              public function attach(SplObserver $observer){

                     $this->observers[] = $observer;

              }

              public function detach(SplObserver $observer){

                     if($idx = array_search($observer, $this->observers, true)) {

                            unset($this->observers[$idx]);     

                     }

              }

              public function notify(){

                     foreach($this->observers as $observer){

                            $observer->update($this);

                     }

              }

              public function setValue($value){

                     $this->value = $value;

                     $this->notify();

              }

              public function getValue(){

                     return $this->value;      

              }

       }

       class observer implements SplObserver{

              public function update(SplSubject $subject){

                     echo ‘The new state of subject’.$subject->getValue(); 

              }    

       }

       $subject = new subject();

       $observer = new observer();

       $subject->attach($observer);

       $subject->setValue(5);//observer     update  ,    The new state of subject 5