>  기사  >  백엔드 개발  >  PHP 객체 지향 고급 디자인 패턴: 관찰자 패턴 사용 예

PHP 객체 지향 고급 디자인 패턴: 관찰자 패턴 사용 예

巴扎黑
巴扎黑원래의
2017-05-23 13:45:561589검색

관찰자 패턴이란 무엇인가요?

옵저버 디자인 패턴을 사용하면 대상 객체의 상태를 보는 객체를 더 쉽게 생성할 수 있으며 핵심 객체와 분리된 특정 기능을 제공합니다.

패턴은 매우 간단합니다. 객체는 다른 객체인 관찰자가 자신을 등록할 수 있도록 하는 메서드를 추가하여 객체 자체를 관찰 가능하게 만듭니다. 관찰 가능한 객체가 변경되면 등록된 관찰자에게 메시지를 보냅니다. 이러한 관찰자는 이 정보를 사용하여 관찰 가능한 객체와 독립적인 작업을 수행합니다. 결과적으로 객체는 이유를 이해하지 않고도 서로 대화할 수 있습니다.


UML

이 다이어그램은 Observer 디자인 패턴을 사용한 클래스 디자인을 자세히 설명합니다.

PHP 객체 지향 고급 디자인 패턴: 관찰자 패턴 사용 예

다음은 위 그림에 대한 설명입니다.

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(&#39;XXX&#39;,&#39;XXX&#39;,&#39;127.0.0.1&#39;);  
?>  
出错时的运行结果:  
SecurityMonitor:XXX于127.0.0.1登录失败[Finished in 0.1s]

로그인 개체가 관찰을 위해 SecurityMonitor 개체를 적극적으로 추가하는 것을 코드에서 볼 수 있습니다. 이런 방식으로 Login::getStatus()를 호출하려면 SecurityMonitor 클래스가 더 많은 정보를 알아야 합니다. ObServable 개체에서 호출이 발생하더라도 해당 개체가 Login 개체이기도 하다는 보장은 없습니다. 이 문제를 해결하기 위한 방법이 있습니다. ObServable 인터페이스를 간헐적으로 일반으로 유지하고 ObServer 클래스는 해당 본문이 올바른 유형인지 확인하는 일을 담당합니다. 그들은 주제에 자신을 추가할 수도 있습니다.

위 내용은 PHP 객체 지향 고급 디자인 패턴: 관찰자 패턴 사용 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.