php 디자인 모델의 관찰자 모델의 응용 예시

2703 단어 php 디자인 모드
이른바 관찰자 모델: 대상 간의 일대다 의존 관계를 정의하고 한 대상의 상태가 바뀔 때 그 대상에 의존하는 모든 대상이 알림을 받고 자동으로 업데이트된다.
관찰자 클래스:
1. 추상적인 주제 역할: 주제 역할은 모든 관찰자 대상에 대한 인용을 하나의 집합에 저장하고 각 주제는 임의로 여러 관찰자를 할 수 있다.추상적인 주제는 관찰자의 대상을 추가하고 삭제하는 인터페이스를 제공한다.
2. 추상적 관찰자 역할: 모든 구체적인 관찰자에게 하나의 인터페이스를 정의하고 관찰의 주제가 바뀔 때 자신을 갱신한다.
3. 구체적인 주제 역할: 관련 상태를 구체적인 관찰자 대상에게 저장하고 구체적인 주제의 내부 상태가 바뀔 때 등록된 모든 관찰자에게 통지한다.구체적인 주제 역할은 통상적으로 하나의 구체적인 서브클래스로 실현된다.
4. 구체적인 관찰자 역할: 구체적인 주제 대상을 저장하고 관련 상태를 저장하며 추상적인 관찰자 역할이 요구하는 업데이트 인터페이스를 실현하여 자신의 상태와 주제의 상태를 일치하게 한다.
역할:
1. 관찰자 모드의 결합도가 비교적 작다
2. 브로드캐스트 통신 지원
인터넷에 엄청 많아요.
4php 자습서에서 php 디자인 모델에 대한 설명은 주로 이론적인 소개에 국한되지만 학습 디자인 모델은 반드시 실례가 있어야 깊이 이해할 수 있다.
이 문서의 인스턴스 코드를 보십시오.
<?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();
?>

좋은 웹페이지 즐겨찾기