PHP 관찰자 모드 분석 Observer

5832 단어 php관찰자
관찰자 모드 구성 도

콘 셉 트
'배우'(피 관찰자),'관중'(관찰자),'카메라'(기록 용기)
[관찰자 모드 의 주요 역할]
1.추상 적 인 주제(Subject)역할:주제 역할 은 모든 관찰자 대상 에 대한 인용 을 하나의 집합 에 저장 하고 모든 주 제 는 여러 명의 관찰자 가 있 을 수 있다.추상 적 인 주 제 는 관찰자 대상 을 추가 하고 삭제 하 는 인 터 페 이 스 를 제공 합 니 다.
2.추상 적 인 관찰자(Observer)역할:모든 구체 적 인 관찰자 에 게 인 터 페 이 스 를 정의 하고 관찰 하 는 주제 가 바 뀌 었 을 때 자신 을 업데이트 한다.
3.구체 적 인 주제(Concrete Subject)역할:관련 상 태 를 구체 적 인 관찰자 대상 에 저장 하고 구체 적 인 주제 의 내부 상태 가 바 뀌 면 등 록 된 모든 관찰자 에 게 알림 을 보낸다.구체 적 인 주제 역할 은 보통 구체 적 인 하위 클래스 로 이 루어 진다.
4.구체 적 인 관찰자(ConcretedObserver)역할:구체 적 인 주제 대상 을 저장 하고 관련 상 태 를 저장 하 며 추상 적 인 관찰자 역할 이 요구 하 는 업데이트 인 터 페 이 스 를 실현 하여 자신의 상태 와 주제 의 상 태 를 일치 시 킵 니 다.
【필드 사용】
프로젝트 매니저 가 우리 에 게 로그 인 인 인 터 페 이 스 를 쓰 라 고 가정 하면 찰 칵 찰 칵 다 썼 다.
다음 날 에 우 리 는 로그 인 횟수 를 통계 한 다음 에 코드 를 추가 하 라 고 했 습 니 다.셋째 날 에 우 리 는 로그 인 지역 을 판단 하고 다음 날 에 코드 를 추가 하 라 고 했 습 니 다.넷 째 날 에 우 리 는 사용자 가 로그 인 한 후에 푸 시 활동 을 하 라 고 했 습 니 다.그리고 그 다음 에 코드 를 추가 한 다음 날 에 이 인 터 페 이 스 는 유지 하고 싶 은 사람 이 없 을 정도 로 복잡 합 니 다.
우 리 는 프로젝트 가 높 은 내부 집적 과 낮은 결합 을 유지 하도록 해 야 한다.관찰자 모드(필요 하지 않 고 수 요 를 볼 수 있다)를 사용 할 수 있다.
[관찰자 모드 와 기타 모드]
1.[중개자 모드](Mediator):복잡 한 업데이트 의 미 를 봉인 함으로써 ChangeManager 는 목표 와 관찰자 간 의 중개자 역할 을 합 니 다.
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 은 피 관찰자 인 터 페 이 스 를 실현 하 였 습 니 다.그 는 지금 피 관찰자 입 니 다.다시 정의$observers 배열,그 가 바로 관중 을 기록 하 는 용기 이다.
먼저 register 방법 을 실현 하고 관찰자 에 게 전달 한 다음 배열 에 넣 고 notify()방법 을 실현 합 니 다.용기 배열 을 옮 겨 다 니 며 모든 관찰자 의 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/>";
     }
 }
여기 서 세 명의 관찰 자 를 정 의 했 는데 모두 Observer 인 터 페 이 스 를 실현 했다.앞의 Subject 는 모든 관찰자 의 watch()방법 을 순환 적 으로 호출 하기 때문에 우 리 는 모든 관찰자 의 watch()방법 을 실현 해 야 한다.
호출

//     
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();
우선 new 피 관찰자 대상 은 register()방법 을 실행 하고 모든 관찰 자 를 용기 배열 에 넣 으 며 마지막 으로 notify()방법 을 실행 하여 모든 관찰자 에 게 자신의 방법 을 실행 하 라 고 알 립 니 다.
PHP 네 이 티 브 관찰자 모드
PHP 자체 관찰자 모드
splabject 인터페이스-피 관찰자Observer 인터페이스-관찰자
SplObjectStorage 대상-용기우선 사용자 로그 인 클래스 가 있 습 니 다.

class user{

  public function login()
  {
      echo '    '
  }
splabject 인 터 페 이 스 를 피 관찰자 로 만 들 었 습 니 다.
  • 먼저 구조 함수 에서 그 에 게 new Spl Object Storag()대상 을 속성 에 할당 하여 나중에 호출 하기에 편리 하도록 합 니 다
  • attach()방법 을 실현 하고 관찰자 등록 에 사용 합 니 다
  • detach()방법 을 실현 하여 관찰 자 를 삭제 합 니 다
  • notify()방법 을 실현 하고 용 기 를 옮 겨 다 니 며 모든 관찰자 의 update 방법(update 여야 함)을 호출 합 니 다
  • rewind 방법 은 용기 지침 을 처음부터 초기 화 하 는 것 입 니 다.valid 방법 은 용기 가 옮 겨 다 니 는 지 확인 하고 불 로 돌아 가 는 것 입 니 다.current 방법 은 현재 관찰 자 를 얻 는 것 입 니 다.next 방법 은 지침 을 한 자리 뒤로 옮 기 는 것 입 니 다
  • login()방법 을 수정 하고 그 안에서 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();
            }
        }
    }
    관찰자
    모든 관찰자 가 SplObserver 인 터 페 이 스 를 실현 하고 update()방법 을 실현 합 니 다.
    
    class cat implements SplObserver {
    
        public function update(SplSubject $subject)
        {
            echo '     ';
        }
    }
    class dog implements SplObserver {
        public function update(SplSubject $subject)
        {
            echo '     ';
        }
    }
    활용 단어 참조
    
    //     
    $user = new user();
    $user->attach(new cat());
    $user->attach(new dog());
    $user->login();
    이상 은 PHP 관찰자 모드(Observer)의 상세 한 내용 을 분석 하 는 것 입 니 다.PHP 관찰자 모드(Observer)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기