백엔드 개발 PHP 튜토리얼 PHP 관찰자 패턴에 대한 자세한 설명

PHP 관찰자 패턴에 대한 자세한 설명

Jun 05, 2018 pm 05:13 PM
php 관찰자 패턴 디자인 패턴

이 글은 주로 PHP 관찰자 모드에 대한 자세한 설명을 소개합니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.

1. Intent
객체 간의 일대다 종속 관계를 정의합니다. 객체의 상태가 변경되면 이에 의존하는 모든 객체에 알림이 전송되고 자동으로 업데이트됩니다. [GOF95]
이를 다시 Publish라고 합니다. -Subscribe(Publish-Subscribe) 모드, Model-View(Model-View) 모드, Source-Listener(Source-Listener) 모드 또는 종속성(Dependents) 모드
2. 관찰자 패턴 구조 다이어그램

3. 관찰자 패턴의 주요 역할 추상 주제(주제) 역할: 주제 역할은 컬렉션의 관찰자 개체에 대한 모든 참조를 저장합니다. 각 주제에는 원하는 수의 관찰자가 있을 수 있습니다. 추상 테마는 관찰자 개체를 추가하고 제거하기 위한 인터페이스를 제공합니다.
추상 관찰자(관찰자) 역할: 모든 특정 관찰자를 위한 인터페이스를 정의하고 관찰 대상이 변경되면 스스로 업데이트합니다.
콘크리트 주체(ConcreteSubject) 역할: 특정 주체의 내부 상태가 변경되면 등록된 모든 관찰자에게 알림이 전송됩니다. 구체적인 테마 역할은 일반적으로 구체적인 하위 클래스를 사용하여 구현됩니다.
Concrete Observer(ConcretedObserver) 역할: 특정 주체 객체를 저장하고, 관련된 상태를 저장하며, 자신의 상태가 주체의 상태와 일치하도록 추상 관찰자 역할에 필요한 업데이트 인터페이스를 구현합니다.
4. 관찰자 패턴의 장점과 단점
관찰자와 대상 간의 결합이 작습니다. 관찰자 패턴 단점:
1 .옵저버는 다른 옵저버의 존재를 모르기 때문에 타겟 변경에 따른 최종 비용을 알 수 없습니다. 이로 인해 예기치 않은 업데이트가 발생할 수 있습니다.
5. 관찰자 패턴의 적용 가능한 시나리오
1. 추상 모델에 두 가지 측면이 있고 그 중 하나가 다른 측면에 의존하는 경우. 2. 한 개체를 변경하면 동시에 다른 개체를 변경해야 하는 경우 변경해야 하는 개체 수를 알 수 없습니다. 3. 개체가 다른 개체에게 알려야 하는 경우 다른 개체가 누구인지 추측할 수 없습니다. 즉, 이러한 개체가 긴밀하게 결합되는 것을 원하지 않습니다.

6. 관찰자 패턴 및 기타 패턴
Mediator 패턴(Mediator): 복잡한 업데이트 의미를 캡슐화함으로써 ChangeManager는 대상과 관찰자 사이의 중재자 역할을 합니다. 싱글턴 모드(싱글턴 모드): ChangeManager는 싱글턴 모드를 사용하여 고유하고 전역적으로 액세스할 수 있는지 확인할 수 있습니다.
7. 관찰자 모드 PHP 예제

<?php
/**
 * 抽象主题角色
 */
interface Subject {
 
  /**
   * 增加一个新的观察者对象
   * @param Observer $observer
   */
  public function attach(Observer $observer);
 
  /**
   * 删除一个已注册过的观察者对象
   * @param Observer $observer
   */
  public function detach(Observer $observer);
 
  /**
   * 通知所有注册过的观察者对象
   */
  public function notifyObservers();
}
 
/**
 * 具体主题角色
 */
class ConcreteSubject implements Subject {
 
  private $_observers;
 
  public function __construct() {
    $this->_observers = array();
  }
 
  /**
   * 增加一个新的观察者对象
   * @param Observer $observer
   */
  public function attach(Observer $observer) {
    return array_push($this->_observers, $observer);
  }
 
  /**
   * 删除一个已注册过的观察者对象
   * @param Observer $observer
   */
  public function detach(Observer $observer) {
    $index = array_search($observer, $this->_observers);
    if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
      return FALSE;
    }
 
    unset($this->_observers[$index]);
    return TRUE;
  }
 
  /**
   * 通知所有注册过的观察者对象
   */
  public function notifyObservers() {
    if (!is_array($this->_observers)) {
      return FALSE;
    }
 
    foreach ($this->_observers as $observer) {
      $observer->update();
    }
 
    return TRUE;
  }
 
}
 
/**
 * 抽象观察者角色
 */
interface Observer {
 
  /**
   * 更新方法
   */
  public function update();
}
 
class ConcreteObserver implements Observer {
 
  /**
   * 观察者的名称
   * @var <type>
   */
  private $_name;
 
  public function __construct($name) {
    $this->_name = $name;
  }
 
  /**
   * 更新方法
   */
  public function update() {
    echo 'Observer', $this->_name, ' has notified.<br />';
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $subject = new ConcreteSubject();
 
    /* 添加第一个观察者 */
    $observer1 = new ConcreteObserver('Martin');
    $subject->attach($observer1);
 
    echo '<br /> The First notify:<br />';
    $subject->notifyObservers();
 
    /* 添加第二个观察者 */
    $observer2 = new ConcreteObserver('phppan');
    $subject->attach($observer2);
 
    echo '<br /> The Second notify:<br />';
    $subject->notifyObservers();
 
    /* 删除第一个观察者 */
    $subject->detach($observer1);
 
    echo '<br /> The Third notify:<br />';
    $subject->notifyObservers();
  }
 
}
 
Client::main();
?>
로그인 후 복사
요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

관련 권장 사항:

PHP에서 사용자 이름, 휴대폰 및 이메일을 숨기기 위해 별표를 구현하는 방법

php WeChat 공개 플랫폼 구성 인터페이스 개발 프로그램 방법의 자세한 예

이전 기사의 PHP 구현 다음 기사 자세한 방법설명

위 내용은 PHP 관찰자 패턴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

CakePHP 날짜 및 시간

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

CakePHP 프로젝트 구성

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

CakePHP 파일 업로드

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

CakePHP 라우팅

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP 토론

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP 빠른 가이드

See all articles