먼저 관찰자 패턴의 개념을 이해하세요. 객체는 다른 객체인 관찰자가 자신을 등록할 수 있도록 하는 메서드를 추가하여 객체 자체를 관찰 가능하게 만듭니다. 관찰 가능한 객체가 변경되면 등록된 관찰자에게 메시지를 보냅니다. 이러한 관찰자는 이 정보를 사용하여 관찰 가능한 객체와 독립적인 작업을 수행합니다. 결과적으로 객체는 이유를 이해하지 않고도 서로 대화할 수 있습니다. 관찰자 패턴은 클래스가 다른 클래스의 상태를 관찰할 수 있도록 하는 이벤트 시스템입니다. 관찰된 클래스의 상태가 변경되면 관찰 클래스는 알림을 받고 해당 조치를 취할 수 있습니다. 구성 요소 간의 긴밀한 결합을 방지하는 기능이 있습니다.
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 메소드는 점점 길어지고 게시 객체도 시스템에 단단히 내장되어 있습니다.
관찰자 패턴 구현
관찰자 패턴의 핵심은 관찰자를 주체와 분리하는 것입니다. 주체가 이벤트가 발생했다는 사실을 알게 되면 관찰자에게 알림을 보내야 합니다. 't want to 주체와 관찰자 사이의 관계가 기록되어 있으므로 위 코드를 수정해 보겠습니다.
//主体必须实现的接口 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을 기반으로 다음 코드를 제공합니다. SplObserver, SplSubject, SplObjectStorage
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; } // ... } }
를 구현하는 코드는 매우 간단합니다. 이 예에서는 몇 가지 감사 방법을 구분하여 이해합니다. post 클래스에서 post 객체를 다른 post 유형으로 사용할 수도 있습니다.
위 내용의 구현은 편집자가 소개한 PHP 디자인 패턴의 관찰자 모드입니다. 모든 분들께 도움이 되길 바랍니다!
위 내용은 PHP 디자인 패턴의 관찰자 패턴 예제를 관련 내용을 포함하여 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.