PHPオブザーバモードの実装コード

2392 ワード

コードは次のとおりです.
 
  
//
class Observed implements SplSubject{
    protected $_name;
    protected $_observers;

    // ,
    public function __construct(){
        $this->_observers = new SplObjectStorage();
    }

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

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

    //
    public function notify(){
        foreach($this->_observers as $observer){
            $observer->showMessage($this);
        }
    }

    // :
    public function setName($name){
        $this->_name = $name;
        $this->notify();
    }

    // :
    public function getName(){
        return $this->_name;
    }

    // :
    public function setAge($age){
        $this->age = $age;
        foreach($this->_observers as $observer){
            $observer->showAge($this->_name,$this->age);
        }
    }

}

//
class Observer implements SplObserver{

    //
    public function showMessage(SplSubject $obj){
        $user = $obj->getName();
        if($user==='admin'){
            echo ' , ',$user,'
';
        }else{
            echo " , '$user'
";
        }
    }
    //
    public function update(SplSubject $subject) {}

    //
    public function showAge($name,$age){
        echo "alert('$name : $age')";
    }
}

$subject = new Observed();  //
$observer = new Observer(); //
$subject->attach($observer);//
$subject->setName(' '); // setName
/*
 * setName   $this->notify();
*   $this->notify() $observer->showMessage($this) ,
* showMessage($obj) ;
*/
$subject->setName('admin');
$subject->setAge(24);