PHP 관찰자 모드 분석 Observer
콘 셉 트
'배우'(피 관찰자),'관중'(관찰자),'카메라'(기록 용기)
[관찰자 모드 의 주요 역할]
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 인 터 페 이 스 를 피 관찰자 로 만 들 었 습 니 다.
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)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.