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