관찰자 패턴이란 무엇인가요?
옵저버 디자인 패턴을 사용하면 대상 객체의 상태를 보는 객체를 더 쉽게 생성할 수 있으며 핵심 객체와 분리된 특정 기능을 제공합니다.
패턴은 매우 간단합니다. 객체는 다른 객체인 관찰자가 자신을 등록할 수 있도록 하는 메서드를 추가하여 객체 자체를 관찰 가능하게 만듭니다. 관찰 가능한 객체가 변경되면 등록된 관찰자에게 메시지를 보냅니다. 이러한 관찰자는 이 정보를 사용하여 관찰 가능한 객체와 독립적인 작업을 수행합니다. 결과적으로 객체는 이유를 이해하지 않고도 서로 대화할 수 있습니다.
UML
이 다이어그램은 Observer 디자인 패턴을 사용한 클래스 디자인을 자세히 설명합니다.
다음은 위 그림에 대한 설명입니다.
1.MyObject는 관찰자 보호 배열인 관찰자를 포함하는 관찰 가능 개체입니다. 공개 메소드 addObserver()는 관찰자의 인스턴스를 받아들이고 이를 관찰자 배열에 저장합니다.
2.doSomething() 공개 메서드가 호출됩니다. 이 메서드는 상태 변경 사항을 MyObject에 적용합니다. 이어서, 루프 관찰자 배열을 순회할 수 있는 inform() 공용 메소드가 호출됩니다.
3.MyObjectObserver에는 MyObject의 인스턴스를 허용하는 Change()라는 공개 메서드가 있습니다. 그런 다음 이 특정 관찰자는 MyObject의 내용에 대해 몇 가지 작업을 수행합니다. 관찰자 배열에서 특정 관찰자를 찾으면 MyObject의 inform() 메서드가 직접 변경() 메서드를 호출합니다.
사용 예:
<?php interface Observable{ function attach( Observer $observer ); function detach( Observer $observer ); function notify(); } class login implements Observable{ const LOGIN_USER_UNKNOW = 1; const LOGIN_WRONG_PASS = 2; const LOGIN_ACCESS = 3; private $status = array(); private $observers = array(); public function setStatus( $status, $user, $ip ) { $this->status = array( $status, $user, $ip ); } public function getStatus() { return $this->status; } public function handleLogin( $user, $pass, $ip ) { switch ( mt_rand( 1, 3 ) ) { case 1: $this->setStatus( self::LOGIN_USER_UNKNOW, $user, $ip ); $ret = false; break; case 2: $this->setStatus( self::LOGIN_WRONG_PASS, $user, $ip ); $ret = false; break; case 3: $this->setStatus( self::LOGIN_ACCESS, $user, $ip ); $ret = true; break; } $this->notify(); return $ret; } public function attach( Observer $observer ) { $this->observers[] = $observer; } public function detach( Observer $observer ) { $newObservers = array(); foreach ( $this->observers as $obs ) { if ( $obs !== $observer ) $newObservers[] = $obs; } $this->observers = $newObservers; } public function notify() { foreach ( $this->observers as $obs ) { $obs->update( $this ); } } } interface Observer{ function update( Observable $observable ); } class SecurityMonitor implements Observer{ function update( Observable $observable ) { $status = $observable->getStatus(); if($status[0] == Login::LOGIN_WRONG_PASS){ echo __CLASS__.":".$status[1]."于".$status[2]."登录失败"; } } } $login = new Login(); $login->attach(new SecurityMonitor()); $login->handleLogin('XXX','XXX','127.0.0.1'); ?> 出错时的运行结果: SecurityMonitor:XXX于127.0.0.1登录失败[Finished in 0.1s]
로그인 개체가 관찰을 위해 SecurityMonitor 개체를 적극적으로 추가하는 것을 코드에서 볼 수 있습니다. 이런 방식으로 Login::getStatus()를 호출하려면 SecurityMonitor 클래스가 더 많은 정보를 알아야 합니다. ObServable 개체에서 호출이 발생하더라도 해당 개체가 Login 개체이기도 하다는 보장은 없습니다. 이 문제를 해결하기 위한 방법이 있습니다. ObServable 인터페이스를 간헐적으로 일반으로 유지하고 ObServer 클래스는 해당 본문이 올바른 유형인지 확인하는 일을 담당합니다. 그들은 주제에 자신을 추가할 수도 있습니다.
위 내용은 PHP 객체 지향 고급 디자인 패턴: 관찰자 패턴 사용 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!