PHP 디자인 모드 의 관찰자 모드 인 스 턴 스

4461 단어 php관찰자패턴
먼저 관찰자 모델 의 개념 을 이해한다.한 대상 은 하나의 방법(이 방법 은 다른 대상,즉 관찰자 가 자신 을 등록 하 는 것 을 허용 한다)을 추가 하여 자 체 를 관찰 할 수 있 게 한다.관찰 가능 한 대상 이 바 뀌 면 등 록 된 관찰자 에 게 메 시 지 를 보 냅 니 다.이 관찰자 들 이 이 정 보 를 사용 하여 수행 하 는 조작 은 관찰 가능 한 대상 과 무관 하 다.결 과 는 대상 이 서로 대화 할 수 있 기 때문에 원인 을 이해 할 필요 가 없다.관찰자 모델 은 일종 의 사건 시스템 으로 이 모델 은 특정한 유형 이 다른 유형의 상 태 를 관찰 할 수 있 음 을 의미한다.관찰 되 는 유형 상태 가 바 뀌 었 을 때 관찰 류 는 통 지 를 받 고 해당 하 는 동작 을 할 수 있다.관찰자 모드 는 구성 요소 간 의 긴밀 한 결합 을 피 할 수 있 도록 제공 합 니 다.
UML 구성 도:

관찰자 모드 해결 문제
우리 의 개발 과정 에서 그 중의 일부 코드 가 다른 일련의 변 화 를 일 으 킬 수 있 는 문 제 를 다소 만 났 을 것 이다.이런 상황 을 완전히 피 하려 면 불가능 하지만 우 리 는 다른 구성 요소 에 대한 의존 을 최대한 줄 이 겠 다 고 대답 했다.관찰자 모델 은 바로 이 문 제 를 해결 하기 위해 서 이다.
예 를 들 어 우 리 는 댓 글 대상 이 있 는데 코드 는 다음 과 같다.

class Post
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
function __construct()
{
// ...
}
//     
public function addPost()
{
// ...     
}
}
위 에 있 는 일반적인 게시 물 대상 입 니 다.댓 글 의 양 과 방 문 량 이 점점 많아 지면 서 운영 자 들 이 그만 두 기 시 작 했 습 니 다.회사 에서 도 자주 신고 전 화 를 받 았 습 니 다.저희 사이트 에 민감 한 내용 과 스 팸 광고 가 많 기 때문에 저 희 는 내용 심 사 를 해 야 합 니 다.먼저 사용자 에 대한 심사 이 고 일부 블랙리스트 사용 자 는 게시 물 을 금지 해 야 합 니 다.둘째,IP 에 대한 심사 이다.셋째,내용 민감 어 에 대한 심사 다.그래서 우리 의 코드 는 다음 과 같은 모양 이 되 었 다.

class Post
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
function __construct()
{
}
public function addPost()
{
if (!Postscan::checkUserid($tihs->_userid)) {
return false;
}
if (!Postscan::ipUserid($tihs->_ip)) {
return false;
}
if (!Postscan::checkContent($tihs->_content)) {
return false;
}
// ... 
}
}
심사 가 필요 한 필드 가 많아 지면 서 addPost 방법 이 길 어 지고 발표 대상 도 이 시스템 에 꼭 끼 워 넣 을 수 밖 에 없습니다.
관찰자 모드 의 실현
관찰자 모델 의 핵심 은 관찰 자 를 주체 에서 분리 시 키 는 것 이다.주체 가 사건 이 발생 한 것 을 알 았 을 때 관찰 은 통 지 를 받 아야 한다.또한 우 리 는 주체 와 관찰자 간 의 관 계 를 죽 이 고 싶 지 않다.그래서 우 리 는 우리 위의 코드 를 수정 했다.

//         
interface Observable {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
//          
interface Observer {
public function do(Observable $subject);
}
class Post implements Observable
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
protected $_observerlist = array();
function __construct()
{
}
public function attach(Observer $observer)
{
$this->_observerlist[] = $observer;
}
public function detach(Observer $observer)
{
foreach ($this->_observerlist as $key => $value) {
if ($observer === $value) {
unset($this->_observerlist[$key])
}
}
}
public function notify()
{
foreach ($this->_observerlist as $value) {
if (!$value->do($this)) {
return false;
}
}
return true;
}
public function addPost()
{
if (!$this->notify()) {
return false;
}
// ... 
}
}
위의 코드 를 통 해 우 리 는 심사 규칙 에 쉽게 가입 할 수 있다.
SPL 코드
관찰자 모드 는 매우 흔 하고 자주 사용 하 는 디자인 모델 로 SPL 확장 은 우리 에 게 해당 하 는 클래스 와 방법 을 패키지 해 주 었 습 니 다.아래 코드 는 SPL 에 따라 제공 하 는 3 가지 요소 입 니 다.SplObserver,SplSubject,SplObject Storage 로 이 루어 진 코드 입 니 다.

class Post implements SplSubject
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
protected $_storage = new SplObjectStorage();
function __construct()
{
}
public function attach(SplObject $observer)
{
$this->_storage->attach($observer);
}
public function detach(SplObject $observer)
{
$this->_storage->detach($observer);
}
public function notify()
{
foreach ($this->_storage as $value) {
if (!$value->update($this)) {
return false;
}
}
return true;
}
public function addPost()
{
if (!$this->notify()) {
return false;
}
// ... 
}
}
간단 하 죠?가장 중요 한 것 은 이해 입 니 다.이 예 에서 우 리 는 심사 방법 을 댓 글 류 에서 벗 겨 냈 고 이 게시 물 대상 도 다른 게시 유형 으로 사용 할 수 있 습 니 다.
이상 의 내용 을 실현 하 는 것 은 여러분 에 게 소개 하 는 PHP 디자인 모델 의 관찰자 모델 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기