php 디자인 모델의 관찰자 모델의 응용 상세

2828 단어 php관찰자 모드
관찰자 모드: 대상 간의 일대다 의존 관계를 정의합니다. 대상의 상태가 바뀌면 모든 의존 대상이 알림을 받고 자동으로 업데이트됩니다.관찰자류: 1.추상적인 주제 역할: 주제 역할은 관찰자 대상에 대한 모든 인용을 하나의 집합에 저장하고 각 주제는 임의의 관찰자를 만들 수 있다.추상적인 테마는 관찰자 대상을 추가하고 삭제하는 인터페이스를 제공합니다.2. 추상적인 관찰자 역할: 모든 구체적인 관찰자를 위한 인터페이스를 정의하고 관찰의 주제가 바뀔 때 자신을 업데이트한다.구체적인 주제 역할: 관련 상태를 구체적인 관찰자 대상에 저장하고 구체적인 주제의 내부 상태가 바뀌면 등록된 모든 관찰자에게 통지한다.구체적인 주제 역할은 통상적으로 하나의 구체적인 하위 유형으로 실현된다.4. 구체적인 관찰자 역할: 구체적인 주제 대상을 저장하고 관련 상태를 저장하며 추상적인 관찰자 역할이 요구하는 업데이트 인터페이스를 실현하여 자신의 상태와 주제의 상태가 일치하도록 한다.관찰자 모드의 결합도가 비교적 작다 2.방송 통신을 지원하다

<?php
//
interface Subject{
     public function attach($observer);
     public function detach($observer);
     public function notifyObservers();
}
//
class ConcreateSubject implements Subject{
     private $_observers;
     public function __construct(){
          $this->_observers = array();
     }

     public function attach($observer){
          return array_push($this->_observers,$observer);
     }

     public function detach($observer){
          $index = array_search($observer,$this->_observers);
          if($index === false || !array_key_exists($index,$this->_observers)){
               return false;
          }
          unset($this->_observer[$index]);
          return true;
     }

     public function notifyObservers(){
          if(!is_array($this->_observers)){
               return false;
          }
          foreach($this->_observers as $observer){
               $observer->update();
          }
          return true;
     }
}

//
interface Observer{
     public function update();
}
//
class ConcreteObserver implement Observer{
     private $_name;
     public function __construct($name){
          $this->_name = $name;
     }

     public function update(){
          echo 'Observer',$this->_name.'has notified<br/>';
     }
}

//
class Client{
     public static function main(){
            $subject = new ConcreteSubject();
            //
            $observer1 = new ConcreteObserver('Martin');
            $subject->attach($observer1);
            //
            $subject->notifyObservers();

            //
            $observer2 = new ConcreteObserver('jaky');
            $subject->attach($observer2);
            //
            $subject->notifyObservers();

            // 1
            $subject->deatch($observer1);
            //
            $subject->notifyObservers();
     }
}

Client::main();
?>

좋은 웹페이지 즐겨찾기